参考文献:
What is authentication in Spring Security?
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。
基本使用:
添加依赖:
- <!-- 安全框架 Spring Security -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-security</artifactId>
- </dependency>
这里有一篇博客入门学习很不错:Spring boot 中 Spring Security 使用改造5部曲
我的项目中的使用:
自定义的User对象:
- /**
- * 自定义的 User 对象
- * 此 User 类不是我们的数据库里的用户类,是用来安全服务的
- */
- public class AnyUser extends User {
- //import org.springframework.security.core.userdetails.User;
- private Long id;
- private String nickname;
- AnyUser(
- String username,
- String password,
- Collection<? extends GrantedAuthority> authorities
- ) {
- super(username, password, authorities);
- }
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- public String getNickname() {
- return nickname;
- }
- public void setNickname(String nickname) {
- this.nickname = nickname;
- }
- }
首先这里我们需要重写UserDetailsService接口,然后实现该接口中的loadUserByUsername方法,通过该方法查询到对应的用户,这里之所以要实现UserDetailsService接口,是因为在Spring Security中我们配置相关参数需要UserDetailsService类型的数据。
Spring Security 支持把权限划分层次,高层次包含低层次的权限,比如 `ROLE_AMDIN,ROLE_USER`两个权限,若用户拥有了ROLE_AMDIN权限,那么相当于有了ROLE_USER权限。用户被授权了ADMIN,那么就相当于有其他所有的权限。
- /**
- * 自定义 UserDetailsService
- */
- @Service
- class AnyUserDetailsService implements UserDetailsService {
- private final UserService userService;
- public AnyUserDetailsService(UserService userService){
- this.userService = userService;
- }
- @Override
- public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
- com.zhou.model.User user = userService.getByEmail(s);
- if (user == null){
- throw new UsernameNotFoundException("用户不存在");
- }
- List<SimpleGrantedAuthority> authorities = new ArrayList<>();
- //对应的权限添加
- authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
- AnyUser anyUser = new AnyUser(s, user.getPassword(), authorities);
- anyUser.setId(user.getId());
- anyUser.setNickname(user.getNickname());
- return anyUser;
- }
- }
- /**
- * 安全控制中心
- */
- @EnableWebSecurity//@EnableWebMvcSecurity 注解开启Spring Security的功能
- public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
- private final