加载中...


github地址

HttpSecurity常用方法

HttpSecurity常用方法 说明
openidLogin() 用于基于OpenId的验证
headers() 将安全标头添加到响应
cors() 配置跨域资源共享(CORS)
sessionManagement() 允许配置会话管理
portMapper() 允许配置一个PortMapper(HttpSecurity#(getSharedObject(class))),其他提供SecurityConfigurer的对象使用PortMapper从HTTP重定向到HTTPS或者从HTTPS重定向到HTTP。默认情况下,Spring Security使用一个PortMapperImpl映射HTTP端口8080到HTTPS端口8443,HTTP端口80到HTTPS端口443
jee() 配置基于容器的预认证。在这种情况下,认证由Servlet容器管理
x509() 配置基于x509的认证
rememberMe 允许配置“记住我”的验证
authorizeRequests() 允许基于使用HttpServletRequest限制访问
requestCache() 允许配置请求缓存
exceptionHandling() 允许配置错误处理
securityContext() 在HttpServletRequests之间的SecurityContextHolder上设置SecurityContext的管理。当使用WebSecurityConfigurerAdapter时,这将自动应用
servletApi() 将HttpServletRequest方法与在其上找到的值集成到SecurityContext中。当使用WebSecurityConfigurerAdapter时,这将自动应用
csrf() 添加CSRF支持,使用WebSecurityConfigurerAdapter时,默认启用
logout() 添加退出登录支持。当使用WebSecurityConfigurerAdapter时,这将自动应用。默认情况是,访问URL”/logout”,使HTTP Session无效来清除用户,清除已配置的任何#rememberMe()身份验证,清除SecurityContextHolder,然后重定向到”/login?success”
anonymous() 允许配置匿名用户的表示方法。当与WebSecurityConfigurerAdapter结合使用时,这将自动应用。默认情况下,匿名用户将使用org.springframework.security.authentication.AnonymousAuthenticationToken表示,并包含角色“ROLE_ANONYMOUS”
formLogin() 指定支持基于表单的身份验证。如果未指定FormLoginConfigurer#loginPage(String),则将生成默认登录页面
oauth2Login() 根据外部OAuth 2.0或OpenID Connect1.0提供程序配置身份验证
requiresChannel() 配置通道安全。为了使该配置有用,必须提供至少一个到所需信道的映射
httpBasic() 配置Http Basic验证
addFilterAt() 在指定的Filter类的位置添加过滤器

Spring Security认证流程

  1. Spring Security支持多种用户认证的方式,最常用的是基于用户名和密码的用户认证方式,其认证流程如下图所示:

  2. “记住我”功能的认证流程如下图所示:

  3. Spring Security的用户认证流程是由一系列的过滤器链来实现的,默认的关于用户认证的过滤器链大致如下图所示:

SpringSecurity采用的是责任链的设计模式, 它有一条很长的过滤器链。
WebAsyncManagerIntegrationFilter 将Security上下文与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,用户将不必填写用户名和密码,而是直接登录进入系统,该过滤器默认不开启。

spring security的认证和授权流程
一文带你搞懂Spring Security认证授权流程


Spring Security登录流程

  1. 用户在页面输入账户密码并提交。
  2. UsernamePasswordAuthenticationFilter拦截认证请求并获取用户输入的账号和密码,
    然后创建一个未认证的Authentication对象并交给AuthenticationManager进行认证。
  3. AuthenticationManager调用相应的AuthenticationProvider对象对未认证的Authentication对象进行认证。
  4. AuthenticationProvider从未认证的Authentication对象中获取用户输入的账号,并调用UserDetailsService对象查询该账号的正确信息,然后检查用户输入的账号信息与正确的账号信息是否相同–(UserDetailsService查询用户所输入的账号所对应的正确的密码和角色等信息并封装成UserDetails对象,然后返回给AuthenticationProvider进行认证),如果不相同则认证失败并返回,如果相同认证成功并创建一个已认证的Authentication对象。
    调用链
    AuthenticationManager.authenticate()–>ProviderManager.authenticate()–>DaoAuthenticationProvider(AbstractUserDetailsAuthenticationProvider).authenticate()处理。
    在最后的authenticate()⽅法中,调⽤了UserDetailsService.loadUserByUsername()并进⾏了密码校验,校验成功就构造⼀个认证过的UsernamePasswordAuthenticationToken对象放⼊SecurityContext。
  5. SecurityContext将已认证的Authentication对象保存在Spring Security上下文环境中表示用户已认证。

相关文章

Spring Security系列~

官方文档 SpringBoot安全认证Security 单点登陆注解@EnableOAuth2Sso
Spring Security中的权限注解很神奇吗?(@PreAuthorize) 想要控制好权限,这八个注解你必须知道 进入SpringBoot2.7,有一个重要的类过期了
新版SpringSecurity如何自定义JSON登录 Spring Security中,想在权限中使用通配符,怎么做? 如何在项目中自定义权限表达式
权限想要细化到按钮,怎么做? Spring Security用户认证和权限控制(默认实现) Spring Security用户认证和权限控制(自定义实现)
Spring Security动态权限实现方案! Spring Security最佳实践,看了必懂!※ 认证和授权:前后端分离状态下使用Spring Security实现安全访问控制
Spring Security中的RememberMe登录 一文带你搞懂Spring Security 盘点Spring Security框架中的八大经典设计模式
Spring Security6全新写法,大变样! 最新版Spring Security,该如何实现动态权限管理? 新版Spring Security中的路径匹配方案!
解锁Spring Security6:核心安全机制

文章作者: xmxe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 xmxe !
 上一篇
阿里巴巴Java开发手册(泰山版) 阿里巴巴Java开发手册(泰山版)
一、编程规约(一) 命名风格 【强制】 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。反例:_name/__name/$name/name_/name$/name_
下一篇 
Redis详解 Redis详解
3种常用的缓存读写策略详解Cache Aside Pattern(旁路缓存模式)Cache Aside Pattern是我们平时使用比较多的一个缓存读写模式,比较适合读请求比较多的场景。Cache Aside Pattern中服务端需要同时
  目录