Spring Boot對Spring Security的支持
Spring Boot針對Spring Security的自動配置在org.springframework.boot.autoconfigure.security包中。
主要通過SecurityAutoConfiguration和SecurityProperties來完成配置。
SecurityAutoConfiguration導入了SpringBootWebSecurityConfiguration中的配置。
在SpringBootWebSecuriyConfiguration配置中,我們獲得如下自動配置。

? Spring Boot為我們做了如此多的配置,當我們需要自己擴展的配置時,只需配置類繼承WebSecurityConfigurerAdapter類即可,無須使用@EnableWebSecurity注解,例如:

下面我們來具體看看代碼:
1.0spring 4.0 對servlet3.0專門添加了一個類(WebApplicationInitializer),來替代web.xml中對于spring mvc的配置,這是工程目錄結構:

config包下主要兩個配置一個是整合spring mvc,一個是整合spring security;
通過繼承WebMvcConfigurerAdapter,來修改對spring mvc的默認配置,spring boot也可直接在application.properties配置。
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter{
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login").setViewName("/login");
}
}
下面是對Spring Security的配置
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
UserDetailsService SysuserService() {
return new SysUserServiceImpl();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(SysuserService());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated().and().formLogin()
.loginPage("/login").failureUrl("/login?error").permitAll().and().logout().permitAll();
}
}
代碼解釋:
?Spring Security配置類
?1)首先繼承WebSecurityConfigurerAdapter
* 2)注冊SysuserService的Bean
* 3)添加我們自定義的user detail service 認證
* 4)所有請求需要認證即登錄才能訪問
* 5)定制登錄行為,登錄頁面可任意訪問
* 6)定制注銷行為,注銷請求可任意訪問
接著我們看看用戶實體類:
public class SysUser implements UserDetails
{?
?private Integer usersId;
?private String username;
?private String password;?
?private List roles;?
@Override
public Collection<? extends GrantedAuthority> getAuthorities()?
{
List auths = new ArrayList<>();
Listroles2 = this.getRoles();
for (SysRole sysRole : roles2) {
auths.add(new SimpleGrantedAuthority(sysRole.getRoleName()));
}
return auths;
}
@Override
public boolean isAccountNonExpired() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isAccountNonLocked() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isCredentialsNonExpired() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
}
讓我們的用戶實體實現(xiàn)UserDetails接口,我們的用戶實體即為Spring Security所使用的用戶重寫getAuthorities方法,將用戶的角色作為權限
角色類:(get set方法沒寫)
public class SysRole{
private Integer roleId;
private String roleName;
}
?多對多的一個映射類
public class SysUserRolesKey {
private Integer sysUserId;
private Integer rolesId;
}
接下來我們看看service,dao層自己實現(xiàn)(orm框架自己選擇)
public class SysUserServiceImpl implements SysUserService,UserDetailsService {
@Autowired
private SysUserMapper sysUserMapper;
@Override
public SysUser findByUsers(String name) {
// TODO Auto-generated method stub
SysUser sysUser = sysUserMapper.findByUserName(name);
return sysUser;
}
@Override
public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {
SysUser sysUser = sysUserMapper.findByUserName(name);
return sysUser;
}
}
代碼解釋:
?自定義需實現(xiàn)UserDetailsService接口
?重寫loadUserByUsername方法獲取用戶
?我們當前用戶實現(xiàn)了UserDetails接口,可直接返回給Spring Security使用
看看控制器類:
@Controller
public class HomeController {
@RequestMapping("/")
public String index(Model model){
Msg msg? = new? Msg("測試","測試內(nèi)容", "額外信息,只對管理員顯示");
model.addAttribute("msg", msg);
return "home";
}
}
每次訪問controller時,會調(diào)用service層的loadUserByUsername方法獲取權限。
前臺我用的thymeleaf,它集成了Spring Security標簽

程序運行截圖:
使用wisely普通用戶登錄:


使用wyf管理員登錄:


參考書籍:JavaEE開發(fā)的顛覆者 Spring Boot實戰(zhàn)