SpringSecurity流程解释与配置1.Spring Security流程解释
流程图
SpringSecurity 采⽤的是责任链的设计模式,它有⼀条很长的过滤器链
  流程⼤致解释
客户端发起⼀个请求进⼊security的过滤链,将 Security 上下⽂异步映射继承之后储存在SecurityContextPersistenceFilte中
⾛到登录判断之后,登出则是logoutHandler成功的话会到logoutSuccessHandler失败ExceptionTranslationFilter,如果不是登出的话则会进⼊下个过滤器⾸先DefaultLoginPageGeneratingFilter处会查询有么有配置的登录页⾯如果有则跳⼊配置的没有则跳⼊默认的
然后判断是否为登录请求,如果是则进⼊UsernamePasswordAuthenticationFilter,如果登录失败则到 AuthenticationFailureHandler 登录失败处理器处理,如果登录成功则到AuthenticationSuccessHandler 登录成功处理器处理,如果不是登录请求则不进⼊该过滤器
  具体参数解释
WebAsyncManagerIntegrationFilter:将 Security 上下⽂与 Spring Web 中⽤于处理异步请求映射的 WebAsyncManager 进⾏集成。
SecurityContextPersistenceFilter:在每次请求处理之前将该请求相关的安全上下⽂信息加载到 SecurityContextHolder 中,然后在该次请求处理完成之后,将 SecurityContextHolder 中关于这次请求的信息存储到⼀个“仓储”中,然后将 SecurityContextHolder 中的信息清除,例如在Session中维护⼀个⽤户的安全信息就是这个过滤器处理的。
HeaderWriterFilter:⽤于将头信息加⼊响应中。
CsrfFilter:⽤于处理跨站请求伪造。
LogoutFilter:⽤于处理退出登录。
DefaultLoginPageGeneratingFilter:如果没有配置登录页⾯,那系统初始化时就会配置这个过滤器,并且⽤于在需要进⾏登录时⽣成⼀个登录表单页⾯
UsernamePasswordAuthenticationFilter:⽤于处理基于表单的登录请求,从表单中获取⽤户名和密码。默认情况下处理来⾃ /login 的请求。从表单中获取⽤户名和密码时,默认使⽤的表单 name 值为 username 和 password,这两个值可以通过设置这个过滤器的usernameParameter 和
passwordParameter 两个参数的值进⾏修改。(后续代码中需要实现userDetailsService和passwordEncoder)
BasicAuthenticationFilter:检测和处理 http basic 认证
RequestCacheAwareFilter:⽤来处理请求的缓存
SecurityContextHolderAwareRequestFilter:主要是包装请求对象request
AnonymousAuthenticationFilter:检测 SecurityContextHolder 中是否存在 Authentication 对象,如果不存在为其提供⼀个匿名 Authentication SessionManagementFilter:管理 session 的过滤器
ExceptionTranslationFilter:处理 AccessDeniedException 和 AuthenticationException 异常
FilterSecurityInterceptor:可以看做过滤器链的出⼝
RememberMeAuthenticationFilter:当⽤户没有登录⽽直接访问资源时, 从 cookie ⾥出⽤户的信息, 如果 Spring Security 能够识别出⽤户提供的remember me cookie, ⽤户将不必填写⽤户名和密码, ⽽是直接登录进⼊系统,该过滤器默认不开启。
2.java配置
  (1)导⼊xml
    ⼀般导⼊第⼀个就⾏了,第⼆个是将原本放⼊内存的session放⼊redis中(可配可不配)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
  (2)实现配置
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth){}
@Override
public void configure(WebSecurity web){}
@Override
protected void configure(HttpSecurity http) throws Exception {}
}
  (3)解释   
1.          configure(WebSecurity web)这个配置⽅法⽤于配置静态资源的处理⽅式,可使⽤ Ant 匹配规则。负责http web安全
      configure(AuthenticationManagerBuilder auth)⾝份验证管理⽣成器,AuthenticationManager 的建造器,配置
AuthenticationManagerBuilder 会让Security ⾃动构建⼀个 AuthenticationManager(该类的功能参考流程图);如果想要使⽤该功能你需要配置⼀个UserDetailService 和 PasswordEncoder。UserDetailsService ⽤于在认证器中根据⽤户传过来的⽤户名查⼀个⽤户, PasswordEncoder ⽤于密码的加密与⽐对,我们存储⽤户密码的时候⽤de() 加密存储,在认证器⾥会调⽤ PasswordEncoder.matches() ⽅法进⾏密码⽐对。如果重写了该⽅法,Security 会启⽤ DaoAuthenticationProvider 这个认证器,该认证就是先调⽤ UserDetailsService.loadUserByUsername 然后使⽤PasswordEncoder.matches() 进⾏密码⽐对,如果认证成功成功则返回⼀个 Authentication 对象。
3.          configure(HttpSecurity http)HTTP请求安全处理,这个是最重要的
http.formLogin().loginPage("/login")
.usernameParameter("username")
.passwordParameter("password")
.loginProcessingUrl("/sing_in").permitAll();
 这个表⽰配置了以表单⽅式提交,登录页为login,登录⽤户名和密码,还有登录请求路径,并且⽀持全部⽤户访问
http
.authorizeRequests()
.antMatchers("/test").hasRole("test")
.anyRequest().authenticated()
.accessDecisionManager(accessDecisionManager());
权限相关的配置,配置了⼀个 /test的url 该有什么权限才能访问, anyRequest() 表⽰所有请求,authenticated() 表⽰已登录⽤户才能访问,accessDecisionManager() 表⽰绑定在 url 上的鉴权管理器
所以权限的配置⾃由度很⾼,鉴权器可以绑定在任意url上,还可以硬编码任意url
登出和登出成功处理器
http
.logout()
.logoutUrl("/logout")
.logoutSuccessHandler(new MyLogoutSuccessHandler())
鉴权失败的处理器
spring启动流程面试回答http
.exceptionHandling()
.accessDeniedHandler(new MyAccessDeniedHandler());
插⼊⾃定义过滤器。addFilterBefore 加在对应的过滤器之前,addFilterAfter 加在对应的过滤器之后,addFilterAt 加在过滤器同⼀位置
框架原有的 Filter 在启动 HttpSecurity 配置的过程中,都由框架完成了其⼀定程度上固定的配置,是不允许更改替换的。根据测试结果来看,调⽤addFilterAt ⽅法插⼊的 Filter ,会在这个位置上的原有 Filter 之前执⾏。
http.addFilterAfter(new MyFittler(), LogoutFilter.class);
http.addFilterAt(getAuthenticationFilter(),UsernamePasswordAuthenticationFilter.class);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。