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);
相关推荐
青槿吖15 小时前
【保姆级教程】Spring事务控制通关指南:XML+注解双版本,避坑指南全奉上
xml·java·开发语言·数据库·sql·spring·mybatis
mygljx15 小时前
spring-ai 下载不了依赖spring-ai-openai-spring-boot-starter
java·人工智能·spring
小涛不学习15 小时前
Java 后端核心框架面试题(Spring / SpringMVC / MyBatis / MyBatis-Plus)
java·spring·mybatis
百锦再16 小时前
飞算 JavaAI:我的编程强力助推引擎
java·spring·ai·编程·idea·code·飞算
a56299161918 小时前
【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目
java·spring boot·spring
代码探秘者20 小时前
【大模型应用】4.分块之六大策略
java·数据结构·后端·python·spring
那我掉的头发算什么20 小时前
【博客系统】基于Spring全家桶的博客系统(下)
java·后端·spring·mybatis·开发
独自破碎E20 小时前
【面试真题拆解】Spring中的注解
数据库·spring·面试
不吃香菜学java20 小时前
苍穹外卖-新增菜品需求分析
java·spring boot·spring·tomcat·maven·ssm
计算机学姐1 天前
基于SpringBoot的中药材店铺管理系统
java·vue.js·spring boot·后端·spring·tomcat·推荐算法