Spring Security验证流程剖析及自定义验证方法

Spring Security的本质

Spring Security 本质上是一连串的 Filter , 然后又以一个独立的 Filter 的形式插入到 Filter Chain 里,其名为 FilterChainProxy 。 如图所示。

实际上 FilterChainProxy 下面可以有多条 Filter Chain ,来针对不同的URL做验证,而 Filter Chain 中所拥有的 Filter 则会根据定义的服务自动增减。所以无需要显示再定义这些 Filter ,除非想要实现自己的逻辑。

关键类

Authentication

Authentication 是一个接口,用来表示用户认证信息,在用户登录认证之前相关信息会封装为一个 Authentication 具体实现类的对象,在登录认证成功之后又会生成一个信息更全面,包含用户权限等信息的 Authentication 对象,然后把它保存在 SecurityContextHolder 所持有的 SecurityContext 中,供后续的程序进行调用,如访问权限的鉴定等。

AuthenticationManager

用来做验证的最主要的接口为 AuthenticationManager ,这个接口只有一个方法:

public interface AuthenticationManager {
 Authentication authenticate(Authentication authentication)
 throws AuthenticationException;
}

其中 authenticate() 方法运行后可能会有三种情况:

验证成功,返回一个带有用户信息的 Authentication 。

验证失败,抛出一个 AuthenticationException 异常。

无法判断,返回 null 。

ProviderManager

ProviderManager 是上面的 AuthenticationManager 最常见的实现,它不自己处理验证,而是将验证委托给其所配置的 AuthenticationProvider 列表,然后会依次调用每一个 AuthenticationProvider 进行认证,这个过程中只要有一个 AuthenticationProvider 验证成功,就不会再继续做更多验证,会直接以该认证结果作为 ProviderManager 的认证结果。

认证过程

用户使用用户名和密码进行登录。

Spring Security 将获取到的用户名和密码封装成一个 Authentication 接口的实现类,比如常用的 UsernamePasswordAuthenticationToken 。

将上述产生的 Authentication 对象传递给 AuthenticationManager 的实现类 ProviderManager 进行认证。

ProviderManager 依次调用各个 AuthenticationProvider 进行认证,认证成功后返回一个封装了用户权限等信息的 Authentication 对象。

将 AuthenticationManager 返回的 Authentication 对象赋予给当前的 SecurityContext 。

自定义验证

有了以上的知识储备后就可以来自定义验证方法了。通过上面可以看出,实际上真正来做验证操作的是一个个的 AuthenticationProvider ,所以如果要自定义验证方法,只需要实现一个自己的 AuthenticationProvider 然后再将其添加进 ProviderManager 里就行了。

自定义AuthenticationProvider

@Component
public class CustomAuthenticationProvider
 implements AuthenticationProvider {
 @Override
 public Authentication authenticate(Authentication authentication)
 throws AuthenticationException {
 String name = authentication.getName();
 String password = authentication.getCredentials().toString();
 if (shouldAuthenticateAgainstThirdPartySystem()) {
  // use the credentials
  // and authenticate against the third-party system
  return new UsernamePasswordAuthenticationToken(
  name, password, new ArrayList<>());
 } else {
  return null;
 }
 }
 @Override
 public boolean supports(Class<?> authentication) {
 return authentication.equals(
  UsernamePasswordAuthenticationToken.class);
 }
}

其中的 supports() 方法接受一个 authentication 参数,用来判断传进来的 authentication 是不是该 AuthenticationProvider 能够处理的类型。

注册AuthenticationProvider

现在再将刚创建的 AuthenticationProvider 在 与ProviderManager 里注册,所有操作就完成了。

@Configuration
@EnableWebSecurity
@ComponentScan("org.baeldung.security")
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 @Autowired
 private CustomAuthenticationProvider authProvider;
 @Override
 protected void configure(
 AuthenticationManagerBuilder auth) throws Exception {
 auth.authenticationProvider(authProvider);
 }
 @Override
 protected void configure(HttpSecurity http) throws Exception {
 http.authorizeRequests().anyRequest().authenticated()
  .and()
  .httpBasic();
 }
}

总结

以上所述是小编给大家介绍的Spring Security验证流程剖析及自定义验证方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • Spring Security 图片验证码功能的实例代码
  • spring security4 添加验证码的示例代码
  • Spring Security Oauth2.0 实现短信验证码登录示例
  • 详解使用Spring Security进行自动登录验证
  • Spring Boot中整合Spring Security并自定义验证代码实例
(0)

相关推荐

  • 详解使用Spring Security进行自动登录验证

    在之前的博客使用SpringMVC创建Web工程并使用SpringSecurity进行权限控制的详细配置方法 中,我们描述了如何配置一个基于SpringMVC.SpringSecurity框架的网站系统.在这篇博客中,我们将继续描述如何使用Spring Security进行登录验证. 总结一下Spring Security的登录验证关键步骤: 1.在数据库中建好三张表,即users.authorities和persistent_logins三个.注意字段的定义,不能少,可以多,名字必须按规定来.

  • spring security4 添加验证码的示例代码

    spring security是一个很大的模块,本文中只涉及到了自定义参数的认证.spring security默认的验证参数只有username和password,一般来说都是不够用的.由于时间过太久,有些忘,可能有少许遗漏.好了,不废话. spring以及spring security配置采用javaConfig,版本依次为4.2.5,4.0.4 总体思路:自定义EntryPoint,添加自定义参数扩展AuthenticationToken以及AuthenticationProvider进行

  • Spring Boot中整合Spring Security并自定义验证代码实例

    最终效果 1.实现页面访问权限限制 2.用户角色区分,并按照角色区分页面权限 3.实现在数据库中存储用户信息以及角色信息 4.自定义验证代码 效果如下: 1.免验证页面 2.登陆页面 在用户未登录时,访问任意有权限要求的页面都会自动跳转到登陆页面. 3.需登陆才能查看的页面 用户登陆后,可以正常访问页面资源,同时可以正确显示用户登录名: 4.用户有角色区分,可以指定部分页面只允许有相应用户角色的人使用 4.1.只有ADMIN觉得用户才能查看的页面(权限不足) 4.2.只有ADMIN觉得用户才能查

  • Spring Security 图片验证码功能的实例代码

    验证码逻辑 以前在项目中也做过验证码,生成验证码的代码网上有很多,也有一些第三方的jar包也可以生成漂亮的验证码.验证码逻辑很简单,就是在登录页放一个image标签,src指向一个controller,这个Controller返回把生成的图片以输出流返回给页面,生成图片的同时把图片上的文本放在session,登录的时候带过来输入的验证码,从session中取出,两者对比.这位老师讲的用Spring Security集成验证码,大体思路和我说的一样,但更加规范和通用些. spring securi

  • Spring Security Oauth2.0 实现短信验证码登录示例

    本文介绍了Spring Security Oauth2.0 实现短信验证码登录示例,分享给大家,具体如下: 定义手机号登录令牌 /** * @author lengleng * @date 2018/1/9 * 手机号登录令牌 */ public class MobileAuthenticationToken extends AbstractAuthenticationToken { private static final long serialVersionUID = SpringSecur

  • Spring Security验证流程剖析及自定义验证方法

    Spring Security的本质 Spring Security 本质上是一连串的 Filter , 然后又以一个独立的 Filter 的形式插入到 Filter Chain 里,其名为 FilterChainProxy . 如图所示. 实际上 FilterChainProxy 下面可以有多条 Filter Chain ,来针对不同的URL做验证,而 Filter Chain 中所拥有的 Filter 则会根据定义的服务自动增减.所以无需要显示再定义这些 Filter ,除非想要实现自己的逻

  • 详解Spring Security认证流程

    前言 Spring Seuciry相关的内容看了实在是太多了,但总觉得还是理解地不够巩固,还是需要靠知识输出做巩固. 相关版本: java: jdk 8 spring-boot: 2.1.6.RELEASE 过滤器链和认证过程 一个认证过程,其实就是过滤器链上的一个绿色矩形Filter所要执行的过程. 基本的认证过程有三步骤: Filter拦截请求,生成一个未认证的Authentication,交由AuthenticationManager进行认证: AuthenticationManager的

  • Spring Security密码解析器PasswordEncoder自定义登录逻辑

    目录 一.PasswordEncoder密码解析器详解 1.接口介绍 2.内置解析器介绍 3.BCryptPasswordEncoder简介 4.代码演示 二.自定义登录逻辑 1.编写配置类 2.自定义逻辑 3.查看效果 一.PasswordEncoder密码解析器详解 Spring Security要求容器中必须有PasswordEncoder实例.所以当自定义登录逻辑时要求必须给容器注入PaswordEncoder的bean对象 1.接口介绍 encode():把参数按照特定的解析规则进行解

  • Spring Security 表单登录功能的实现方法

    1.简介 本文将重点介绍使用 Spring Security 登录. 本文将构建在之前简单的 Spring MVC示例 之上,因为这是设置Web应用程序和登录机制的必不可少的. 2. Maven 依赖 要将Maven依赖项添加到项目中,请参阅Spring Security with Maven 一文. 标准的 spring-security-web 和 spring-security-config 都是必需的. 3. Spring Security Java配置 我们首先创建一个扩展 WebSe

  • spring security在分布式项目下的配置方法(案例详解)

    分布式项目和传统项目的区别就是,分布式项目有多个服务,每一个服务仅仅只实现一套系统中一个或几个功能,所有的服务组合在一起才能实现系统的完整功能.这会产生一个问题,多个服务之间session不能共享,你在其中一个服务中登录了,登录信息保存在这个服务的session中,别的服务不知道啊,所以你访问别的服务还得在重新登录一次,对用户十分不友好.为了解决这个问题,于是就产生了单点登录: **jwt单点登录:**就是用户在登录服务登录成功后,登录服务会产生向前端响应一个token(令牌),以后用户再访问系

  • Spring Security前后分离校验token的实现方法

    目录 前言 token配置 引入JWT依赖文件 配置token管理器类 security配置 配置未登录处理类 配置无权限处理类 配置登出操作处理类 配置token认证过滤器 配置token权限校验过滤器 自定义加密类 配置UserDetailService 配置数据库User对象映射类 配置UserDetailService使用的SecurityUser类 配置mybatis-plus 配置security配置类 配置几个测试接口 Md5加密工具类 测试 首先测试登录 测试存在权限的接口 测试

  • Spring Security认证的完整流程记录

    目录 前言 认证上下文的持久化 认证信息的封装 查找处理认证的 Provider 类 认证逻辑 总结 前言 本文以用户名/密码验证方式为例,讲解 Spring Security 的认证流程,在此之前,需要你了解 Spring Security 用户名/密码认证的基本配置. Spring Security 是基于过滤器的,通过一层一层的过滤器,处理认证的流程,拦截非法请求. 认证上下文的持久化 处于最前面的过滤器叫做 SecurityContextPersistenceFilter,Spring

  • Spring Security自定义认证逻辑实例详解

    目录 前言 分析问题 自定义 Authentication 自定义 Filter 自定义 Provider 自定义认证成功/失败后的 Handler 配置自定义认证的逻辑 测试 总结 前言 这篇文章的内容基于对Spring Security 认证流程的理解,如果你不了解,可以读一下这篇文章:Spring Security 认证流程 . 分析问题 以下是 Spring Security 内置的用户名/密码认证的流程图,我们可以从这里入手: 根据上图,我们可以照猫画虎,自定义一个认证流程,比如手机短

  • 详解Spring Security的Web应用和指纹登录实践

    前言 Java 开发人员在解决 Web 应用安全相关的问题时,通常会采用两个非常流行的安全框架,Shiro 和 Spring Security.Shiro 配置简单,上手快,满足一般应用的安全需求,但是功能相对单一.Spring Security 安全粒度细,与 Spring Framework 无缝集成,满足绝大多数企业级应用的安全需求,但是配置复杂,学习曲线陡峭. Spring Security 相对 Shiro 功能强大,并且 Spring Framework,Spring Boot,Sp

随机推荐