AbstractTokenGranter 是 OAuth2 认证授权流程中的一个关键接口,用于实现不同类型的授权方式。它的主要功能是在认证授权的过程中负责颁发令牌(Token)。在 Spring Security OAuth 或类似的框架中,TokenGranter 是用于扩展和自定义授权流程的重要接口之一。
主要功能包括:
1 支持不同授权类型: TokenGranter 允许定义和实现不同的授权类型,例如授权码模式、密码模式、客户端凭证模式、刷新令牌模式等。每种授权类型都有不同的验证和颁发令牌的流程。
2 验证授权信息: 通过实现getOauth2Authentication方法接收并验证来自客户端的授权信息,如用户名密码、授权码、客户端凭证等。
3 生成令牌(Token): 验证通过后,TokenGranter 负责生成并返回访问令牌(Access Token)和刷新令牌(Refresh Token)给客户端。
4 灵活性和扩展性: 提供了灵活的接口和机制,允许开发者根据需求扩展和定制特定的授权类型。
5 安全性和控制: 在认证和授权的过程中,TokenGranter 可以负责执行安全性检查和控制,确保授权过程的安全性和合法性。
在 Spring Security OAuth2 等框架中,你可以通过实现 AbstractTokenGranter接口来定义自己的授权类型或者扩展现有的授权方式,以满足特定的认证授权需求。这个接口提供了很高的灵活性和定制能力,允许开发者根据具体场景实现自定义的认证授权逻辑。
代码举例:完整项目代码下载
public class UserPwdGranter extends AbstractTokenGranter {
//定义一个授权模式
private static final String GRANT_TYPE = "user_pwd";
private final AuthenticationManager authenticationManager;
//初始化授权模式
public UserPwdGranter(AuthenticationManager authenticationManager, AuthorizationServerTokenServices tokenServices
, ClientDetailsService clientDetailsService, OAuth2RequestFactory requestFactory) {
super(tokenServices, clientDetailsService, requestFactory, GRANT_TYPE);
this.authenticationManager = authenticationManager;
}
/**
* 获得降权信息,生成鉴权token信息,将token传递给自定义的鉴权类鉴权,成功测返回token
* @param client
* @param tokenRequest
* @return
*/
@Override
protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, TokenRequest tokenRequest) {
Map<String, String> parameters = new LinkedHashMap<>(tokenRequest.getRequestParameters());
String user = parameters.get("user");
String password = parameters.get("password");
//将其中的密码移除
parameters.remove("password");
Authentication userAuth = new UserPasswordAuthenticationToken(user, password);
((AbstractAuthenticationToken) userAuth).setDetails(parameters);
//调用AuthenticationManager进行认证,内部会根据MobileAuthenticationToken找到对应的Provider进行认证
userAuth = authenticationManager.authenticate(userAuth);
if (userAuth == null || !userAuth.isAuthenticated()) {
throw new InvalidGrantException("Could not authenticate mobile: " + user);
}
OAuth2Request storedOAuth2Request = getRequestFactory().createOAuth2Request(client, tokenRequest);
return new OAuth2Authentication(storedOAuth2Request, userAuth);
}
}