Spring Security中AuthenticationProvider的authenticate()返回null的原因及场景
关于Spring Security AuthenticationProvider
authenticate()返回null的问题解答 核心逻辑不冲突的原因
supports() 方法的校验维度是类级别,仅判断当前Provider是否支持处理传入的Authentication对象的类型,只要类型匹配就会返回true。而authenticate() 是针对具体的Authentication实例做业务场景级的校验,类型符合不代表当前Provider能处理该实例对应的实际认证请求,因此官方文档的描述和现有校验逻辑完全不冲突。
实际应用场景
- 同认证类型多认证方式场景:比如自定义统一的
UnifiedAuthToken作为全场景认证入参,同时支持账号密码、短信验证码、第三方OAuth三种登录方式。你可以定义3个AuthenticationProvider都声明supports(UnifiedAuthToken.class):第一个账号密码Provider拿到实例后,检查参数中是否携带账号密码字段,不存在就返回null,自动流转到下一个短信验证码Provider;验证码Provider检查是否携带手机号和验证码字段,不存在就返回null,继续流转到OAuth Provider处理。 - 多租户动态认证适配场景:多租户系统中不同租户的认证逻辑不同,比如租户A要求走LDAP认证,租户B要求走本地数据库认证,二者都用标准的
UsernamePasswordAuthenticationToken作为入参。此时可以定义两个Provider都支持该Token类型:LDAP Provider拿到实例后先解析租户ID,不属于LDAP认证的租户直接返回null,流转到本地数据库Provider处理。 - 前置特权校验场景:比如你需要做一个专门处理内部服务调用的特权认证Provider,同样使用标准的
UsernamePasswordAuthenticationToken入参,Provider先检查请求是否携带内部服务标识,携带的话直接构造高权限认证结果返回,不携带就返回null,流转到后面的普通用户名密码认证Provider处理。
内容的提问来源于stack exchange,提问作者Amimul Ehsan Rahi
相关产品推荐
相关产品推荐

