关于spring-security-oauth2:Spring-Security-Oauth2协议扩展授权模式之通过自定义字段刷新accesstoken
1、Spring Security如何优雅的减少OAuth2协定受权模式?以后教程是对于如何通过自定义字段刷新access_token的,要扩大受权模式请参考这位博主的教程:https://www.cnblogs.com/zlt20... 2、为什么要自定义刷新access_token的关键字段Oauth2协定默认的刷新access_token流程就是仅通过惟一username进行刷新access_token的。当咱们模拟password受权模式扩大出比方手机号/邮箱+明码登录的受权模式且前端不应用username字段或username字段容许反复时,此时咱们就不能通过username字段进行刷新access_token,须要在access_token中携带一个惟一的字段比方userId或mobile提供给受权服务器刷新token应用。因为刷新token与生成token的流程仅有小局部不同。对于Spring Security Oauth2 认证(获取token/刷新token)流程(password模式)剖析,请移步:https://blog.csdn.net/bluuuse... 3、实现过程3.1 整个拷贝UserDetailsByNameServiceWrapper这个类的内容做如下扩大,次要批改loadUserDetails()办法。 package com.nowenti.auth.security.service;import cn.hutool.core.convert.Convert;import com.nowenti.auth.security.exception.UserIdNotFoundException;import org.springframework.security.core.Authentication;import org.springframework.security.core.userdetails.AuthenticationUserDetailsService;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.util.Assert;/** * @Description: 自定义扩大的受权模式专用ServiceWrapper * 通过用户id加载用户details -> 用于通过user_id刷新token * 自定义以后ServiceWrapper的目标是让刷新token时能够抉择通过用户名或用户id去加载UserDetails * @version 1.0 * @author owen * @email 975706304@qq.com * @date 2021/8/16 23:04 */public class UserDetailsByNameOrIdServiceWrapper<T extends Authentication> implements AuthenticationUserDetailsService<T> { // 结构器注入 private ICustomUserDetailsService userDetailsService; public UserDetailsByNameOrIdServiceWrapper() { } public UserDetailsByNameOrIdServiceWrapper(ICustomUserDetailsService userDetailsService) { Assert.notNull(userDetailsService, "userDetailsService cannot be null."); this.userDetailsService = userDetailsService; } /** * 加载用户详情对象 * authentication.getName()的值有两种状况,须要手动辨别 * 1、user_name * 2、user_id * 3、任意自定义字段 * @param authentication * @return * @throws UserIdNotFoundException */ @Override public UserDetails loadUserDetails(T authentication) { // 从PreAuthenticatedAuthenticationToken获取Principle // Principle是 -> UsernamePasswordAuthenticationToken对象 // UsernamePasswordAuthenticationToken对象的Principle就是nameOrId String usernameOrUserId = authentication.getName(); try { // 能正确转换成Long型用户id -> 会员用户 Long userId = Convert.toLong(usernameOrUserId); return this.userDetailsService.loadMemberUserById(userId); } catch (Exception e) { // 转换异样,usernameOrUserId为用户名 -> 零碎用户 return this.userDetailsService.loadUserByUsername(usernameOrUserId); } } public void setUserDetailsService(ICustomUserDetailsService aUserDetailsService) { this.userDetailsService = aUserDetailsService; }}3.2 整个拷贝DefaultUserAuthenticationConverter这个类的内容做如下扩大,次要批改extractAuthentication()办法 ...