如何实现各类权限认证方式?

自定义权限认证

客户端向认证服务申请令牌token,成功后,携带token访问资源服务器。流程如图:

 

 

认证服务生成token,通常使用uuid生成随机字符串,并且保存到redis中。

资源服务器使用filter过滤器拦截需要认证的API,并校验token。校验的大概业务如下:

  1. 当前api是否无需权限,根据url规格匹配。
  2. 判断当前服务调用是否是内部服务调用,根据内部服务调用的服务名和密码认证。
  3. 验证是否剔除前一次登录状态。
  4. 根据token获取用户相关信息进行认证。

Spring security权限认证

基于OAuth2协议

https://blog.csdn.net/new_com/article/details/104886605

  • Resource Owner,资源所有者,对受保护的资源拥有访问权限的实体,通常是指一个用户。
  • Resource Server,资源服务器,拥有受保护的资源,允许持有访问令牌(access token)访问资源。
  • Client,客户端,通常是指第三方应用程序。
  • Authorization Server,授权服务器,对用户认证,认证通过后向客户端发送访问令牌(access token)

认证流程

 

客户端信息配置

 

  • resource_ids:客户端拥有资源的配置
  • authorized_grant_types:认证类型,内置和自定义
  • access_token_validity:token有效期设置
  • refresh_token_validity,刷新token有效期设置
  • additional_information:扩展字段,支持JSON格式

 

身份认证

https://blog.csdn.net/new_com/article/details/104706005

通过扩展servlet Filter过滤器实现拦截,主要通过FilterChainProxy内置权限过滤器链(责任链模式)实现认证逻辑。

内置的过滤器

  • SecurityContextPersistenceFilter,用于在认证前后设置SecurityContext值,认证通过以后,会把认证的用户信息保存保存到SecurityContext。(自定义UserContext就是基于此扩展的)
  • UsernamePasswordAuthenticationFilter,用户名和密码验证过滤器,拦截/login请求,对用户进行身份验证。(客户端,用户用户名密码认证)。

AuthenticationManage认证处理器,定义了一个AuthenticationProvider列表,定义了身份认证逻辑,扩展的认证方式

  • PlatformWeChatCodeTokenGranter:微信认证
  • PlatformSmsCodeTokenGranter:短信验证码认证
  • PlatformAuthRegisterTokenGranter:短信验证码,微信注册登录认证

资源授权

https://blog.csdn.net/new_com/article/details/104728471

FilterSecurityInterceptor 资源授权过滤器。

AccessDecisionManager授权处理器,包含一个AccessDecisionVoter列表,用于组合处理授权逻辑。

 

集成JWT

https://blog.csdn.net/new_com/article/details/108890664

生成token

JwtAccessTokenConverter生成Bearer token。

JwtTokenUserEnhancer,把用户信息扩展到token的additionalInformation扩展字段中,系统中定义UserWrapper设置为权限认证对象。

校验token

资源服务调用OAuth2AuthenticationProcessingFilter,验证token的有效性。使用JwtTokenStore,根据传输的token转换为认证信息。

UserAuthenticationConverter,根据token的additionalInformation扩展字段转换为当前登录用户信息。定义UserContext设置为当前登录。

扩展短信验证码认证,微信认证

短信验证码认证

PlatformSmsCodeTokenGranter:设置sms_code认证方式,并且添加到客户端配置

PlatformSmsCodeAuthenticationProvider:定义短信验证码认证逻辑。

PlatformSmsCodeAuthenticationToken:接受传递短信验证码认证的参数。

微信认证

PlatformWeChatCodeTokenGranter:设置wechat微信认证

PlatformWeChatCodeAuthenticationProvider:微信认证逻辑

PlatformWeChatCodeAuthenticationToken:接受传递

扩展多租户权限认证

登录时,就可以知道当前用户属于哪个平台。

  1. 在客户端additionalInformation扩展字段设置平台code。
  2. 改造基于用户名密码登录过滤器UsernamePasswordAuthenticationFilter,扩展用户名查询时基于平台code。定义PlatformDaoAuthenticationProvider,扩展获取用户的方法retrieveUser

,从配置的客户端中获取平台code,然后查询用户。并且在身份认证时,必须要在UsernamePasswordAuthenticationFilter之前生效。

basic认证方式

在管理端账号登录时,页面只输入用户名和密码。如何传递客户端名称和密码的信息呢?这是在header中添加 key为Authorization,value为Basic bWFsbF9tZ3Rfd2ViOjEyMzQ1Ng==的形式,Basic之后的值,是客户端的名称和密码通过base64方法加密生成的。

在认证时,BasicAuthenticationFilter会解析客户端的用户名和密码,然后通过ClientDetailsService接口的loadClientByClientId查询客户端信息。系统中JdbcClientDetailsWrapper实现了loadClientByClientId方法,使用内存缓存客户端信息。

认证扩展

同一账号多次登录时,剔除前一次登录。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值