自定义权限认证
客户端向认证服务申请令牌token,成功后,携带token访问资源服务器。流程如图:
认证服务生成token,通常使用uuid生成随机字符串,并且保存到redis中。
资源服务器使用filter过滤器拦截需要认证的API,并校验token。校验的大概业务如下:
- 当前api是否无需权限,根据url规格匹配。
- 判断当前服务调用是否是内部服务调用,根据内部服务调用的服务名和密码认证。
- 验证是否剔除前一次登录状态。
- 根据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:接受传递
扩展多租户权限认证
登录时,就可以知道当前用户属于哪个平台。
- 在客户端additionalInformation扩展字段设置平台code。
- 改造基于用户名密码登录过滤器UsernamePasswordAuthenticationFilter,扩展用户名查询时基于平台code。定义PlatformDaoAuthenticationProvider,扩展获取用户的方法retrieveUser
,从配置的客户端中获取平台code,然后查询用户。并且在身份认证时,必须要在UsernamePasswordAuthenticationFilter之前生效。
basic认证方式
在管理端账号登录时,页面只输入用户名和密码。如何传递客户端名称和密码的信息呢?这是在header中添加 key为Authorization,value为Basic bWFsbF9tZ3Rfd2ViOjEyMzQ1Ng==的形式,Basic之后的值,是客户端的名称和密码通过base64方法加密生成的。
在认证时,BasicAuthenticationFilter会解析客户端的用户名和密码,然后通过ClientDetailsService接口的loadClientByClientId查询客户端信息。系统中JdbcClientDetailsWrapper实现了loadClientByClientId方法,使用内存缓存客户端信息。
认证扩展
同一账号多次登录时,剔除前一次登录。。