SpringSecurity

流程:

UsernamePasswordAuthenticationFilter:负责处理我们在登录页面填写了用户名密码后的登录请求

ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException(授权异常)和AuthenticationException(认证异常)

FilterSecurityInterceptor:负责权限校验的过滤器

认证授权流程

思路分析:

登录

1.自定义登录接口

  • 调用ProviderManager的authenticate方法进行认证 如果认证通过生成jwt
  • 把用户信息存入redis中

2.自定义UserDetailsService

在这个实现类中去查询数据库

校验:

1.定义Jwt认证过滤器

2.获取token

3.解析token获取其中的userid

4.从redis中获取用户信息

5.存入SecurityContextHolder

授权基本流程

在SpringSecurity中,会使用默认的FilterSecurityInceptor来进行权限校验。

在FilterSecurityInceptor中会从SecurityContextHolder获取其中的Authentication,然后获取其中的权限信息。当前用户是否有访问当前资源所需的权限。

所以我们在项目中只需要把当前登陆用户的权限信息也存入Authentication.

然后设置我们的所需资源需要的权限即可

2.在方法上指定这个需要的权限

3.在实体类中定义权限属性,查询后封装到该属性中

复制代码
@Data
@NoArgsConstructor
public class LoginUser implements UserDetails {

 private User user;

 private List<String>permissions;

 @JSONField(serialize = false)// redis为了安全,不会序列化这个对象
 private    List<SimpleGrantedAuthority> authorities ;

    public LoginUser(User user, List<String> permissions) {
        this.user = user;
        this.permissions = permissions;
    }

// 该方法返回一个身份认证对象
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        // 把permissions中String类型的权限信息封装成SimpleGrantedAuthority对象
        if (authorities!=null){
            return authorities;
        }
        authorities=permissions.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList());
        return authorities;
    }

4.在UserDetail中封装权限信息

5.在过滤器中进行身份认证

复制代码
// 4.存入SecurityContextHolder
// 使用有三个参数的构造器,第三个参数可以设置为已认证状态
UsernamePasswordAuthenticationToken authToken =
new UsernamePasswordAuthenticationToken(loginUser,null,loginUser.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authToken);
相关推荐
小许学java6 分钟前
Spring AI快速入门以及项目的创建
java·开发语言·人工智能·后端·spring·ai编程·spring ai
kfepiza2 小时前
Spring 如何解决循环依赖 笔记251008
java·spring boot·spring
kfepiza3 小时前
Spring的三级缓存原理 笔记251008
笔记·spring·缓存
popoxf13 小时前
spring容器启动流程(反射视角)
java·后端·spring
谷哥的小弟14 小时前
Spring Framework源码解析——ApplicationContextAware
spring·源码
武子康14 小时前
Java-141 深入浅出 MySQL Spring事务失效的常见场景与解决方案详解(3)
java·数据库·mysql·spring·性能优化·系统架构·事务
珹洺15 小时前
Java-Spring入门指南(十五)SpringMVC注解开发
java·spring·microsoft
半旧夜夏16 小时前
【Spring】AOP的核心原理配方
java·spring
MX_935920 小时前
SpringBoot项目优先级以及bean的管理
java·spring boot·后端·spring
_extraordinary_1 天前
Java SpringBoot(一)--- 下载Spring相关插件,创建一个Spring项目,创建项目出现的问题
java·spring boot·spring