若依框架中SpringSecurity的实现流程


本篇博客与核桃共同完成

Spring Security

概述

Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,用于保护基于Spring的应用程序的实际标准

核心

认证(Authentication):验证当前访问系统的是不是本系统用户,确定具体用户信息
授权(Authorization):经过认证后判断当前用户是否有权限进行指定操作

原理

图片分析来源于此人的博客 https://muggle.javaboy.org/
Spring Security 采用的是责任链的设计模式,它有一条很长的过滤器链。
大致了解一下每个链对应的功能:

  • WebAsyncManagerIntegrationFilter:将 安全上下文与 Spring Web 中用于处理异步请求映射的 WebAsyncManager 进行集成。
  • SecurityContextPersistenceFilter:在每次请求处理之前将该请求相关的安全上下文信息加载到 SecurityContextHolder 中,然后在该次请求处理完成之后,将 SecurityContextHolder 中关于这次请求的信息存储到一个“仓储”中,然后将 SecurityContextHolder 中的信息清除,例如在Session中维护一个用户的安全信息就是这个过滤器处理的。
  • HeaderWriterFilter:用于将头信息加入响应中。
  • CsrfFilter:用于处理跨站请求伪造。
  • LogoutFilter:用于处理退出登录。
  • UsernamePasswordAuthenticationFilter:用于处理基于表单的登录请求,从表单中获取用户名和密码。默认情况下处理来自 /login 的请求。从表单中获取用户名和密码时,默认使用的表单 name 值为 username 和 password,这两个值可以通过设置这个过滤器的usernameParameter 和passwordParameter 两个参数的值进行修改。
  • DefaultLoginPageGeneratingFilter:如果没有配置登录页面,那系统初始化时就会配置这个过滤器,并且用于在需要进行登录时生成一个登录表单页面。
  • BasicAuthenticationFilter:检测和处理 http basic 认证。
  • RequestCacheAwareFilter:用来处理请求的缓存。
  • SecurityContextHolderAwareRequestFilter:主要是包装请求对象request。
  • AnonymousAuthenticationFilter:检测 SecurityContextHolder 中是否存在 Authentication 对象,如果不存在为其提供一个匿名 Authentication。
  • SessionManagementFilter:管理 session 的过滤器
  • ExceptionTranslationFilter:处理 AccessDeniedException 和 AuthenticationException 异常。
  • FilterSecurityInterceptor:可以看做过滤器链的出口。
  • RememberMeAuthenticationFilter:当用户没有登录而直接访问资源时, 从 cookie 里找出用户的信息, 如果 Spring Security 能够识别出用户提供的remember me cookie, 用户将不必填写用户名和密码, 而是直接登录进入系统,该过滤器默认不开启。
    在这里插入图片描述

若依Sprint Security分析

配置类分析

若依的核心配置类都放在ruoyi-framework模块下,项目启动时加载配置文件。

  • @EnableGlobalMethodSecurity 注解用于开启 Spring 方法级安全,并且声明该类为一个配置类。

这个注解提供了prePostEnabled(常用)、securedEnabled 和 jsr250Enabled 三种不同的机制来实现同一种功能。
prePostEnabled = true 会解锁 @PreAuthorize 和 @PostAuthorize 两个注解,分别是在方法执行前进行验证和在方法执行后进行验证。
@Secured 注解是用来定义业务方法的安全配置。在需要安全[角色/权限等]的方法上指定 @Secured,并且只有那些角色/权限的用户才可以调用该方法。但是这个注解不支持Spring EL表达式,不够灵活。

在这里插入图片描述
在这里插入图片描述

  • 要接管Spring Security 的配置,则需要继承WebSecurityConfigurerAdapter这个抽象类,重写相关的方法

configure(HttpSecurity httpSecurity) 方法中添加过滤器链

在这里插入图片描述
在这里插入图片描述

流程分析图

在这里插入图片描述

过滤器分析

在这里插入图片描述

  • logout 过滤器(用于账号登出功能)
    指定登出的url和处理类
    自定义退出处理类LogoutSuccessHandlerImpl,需继承LogoutSuccessHandler接口,重写onLogoutSuccess()方法对用户的缓存记录和退出信息进行处理
    在这里插入图片描述
  • cors 过滤器
    完整的CORS说明详见: https://www.w3.org/TR/cors/。
    其中跨域请求添加两次,为了保证能处理跨域情况,实际添加一次在Logout过滤器链前即可。实际就是设置允许跨域的请求
    在这里插入图片描述
  • jwt 过滤器
    添加了一个jwt过滤器在用户的账号密码认证前,(用于判断是否存在token),该类又继承了OncePerRequestFilter抽象类(保证一次外部请求,只执行一次过滤方法),用于处理在输入用户名密码前对存在携带的token进行校验是否过期等等,如果token校验成功,那么就会自动读取token中的用户名密码信息,并且设置到对应的安全上下文中,最后放行该次请求(不做对用户名密码校验的处理)
    在这里插入图片描述
    如果没有携带token就需要进行下一个UsernamePasswordAuthenticationFilter用户名密码过滤器处理,该过滤器是将用户名密码读取出来,然后设置到SecurityContextHolder的安全上下文内容中
    在这里插入图片描述
    最后的认证是通过认证管理器来实现最后的认证功能
    在这里插入图片描述
    对于认证失败,不会跳到认证失败处理器,而是直接抛出自定义异常,通过全局的异常处理器来处理认证失败的逻辑
    在这里插入图片描述
    认证错误异常
    在这里插入图片描述

若依登录/退出流程

流程图

在这里插入图片描述

登录

  • 登录按钮点击,通过this.$store.dispatch调用store 里的user.js中的login方法,login方法调用封装的login方法,发送请求到后端

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 在SysLoginController中定义登录接口,并且在SecurityConfig中直接放行/login路径,请求该接口会校验用户名和密码,然后再loginService的login方法中读取用户名和密码交给认证管理器认证,成功后设置认证后的用户信息到token中,返回一个token
    在这里插入图片描述
    在这里插入图片描述

退出

  • 退出登录点击,通过this.$store.dispatch调用store 里的user.js中的logout方法,logout方法调用封装的logout方法,发送请求到后端
    在这里插入图片描述
    在这里插入图片描述
  • 后端对退出登录的url进行拦截,调用退出登录处理器进行用户退出信息处理
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security是一个基于Spring框架的安全框架,它提供了一套完整的安全认证和授权机制。下面是Spring Security的认证流程: 1. 用户访问需要认证的资源,Spring Security会拦截请求并重定向到登录页面。 2. 用户输入用户名和密码,提交表单。 3. Spring Security会将表单提交的用户名和密码封装成一个Authentication对象。 4. AuthenticationManager接口会根据Authentication对象的用户名和密码去调用UserDetailsService接口的实现类获取用户信息。 5. 如果获取到用户信息,则将用户信息封装成一个包含权限信息的Authentication对象返回给AuthenticationManager。 6. AuthenticationManager会将Authentication对象交给AuthenticationProvider接口的实现类进行认证。 7. 如果认证成功,则将认证成功的Authentication对象返回给Spring Security。 8. Spring Security会将认证成功的Authentication对象存储到SecurityContextHolder,供后续的访问授权使用。 下面是一个简单的Spring Security认证流程的代码示例: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasAnyRole("ADMIN", "USER") .anyRequest().authenticated() .and() .formLogin() .and() .logout().logoutSuccessUrl("/login").permitAll(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值