oauth2自定义授权模式-AbstractTokenGranter功能介绍

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);
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值