Spring Boot整合Spring Security

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)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容