fix bug
This commit is contained in:
@@ -0,0 +1,143 @@
|
|||||||
|
/**
|
||||||
|
* BladeX Commercial License Agreement
|
||||||
|
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
|
||||||
|
* <p>
|
||||||
|
* Use of this software is governed by the Commercial License Agreement
|
||||||
|
* obtained after purchasing a license from BladeX.
|
||||||
|
* <p>
|
||||||
|
* 1. This software is for development use only under a valid license
|
||||||
|
* from BladeX.
|
||||||
|
* <p>
|
||||||
|
* 2. Redistribution of this software's source code to any third party
|
||||||
|
* without a commercial license is strictly prohibited.
|
||||||
|
* <p>
|
||||||
|
* 3. Licensees may copyright their own code but cannot use segments
|
||||||
|
* from this software for such purposes. Copyright of this software
|
||||||
|
* remains with BladeX.
|
||||||
|
* <p>
|
||||||
|
* Using this software signifies agreement to this License, and the software
|
||||||
|
* must not be used for illegal purposes.
|
||||||
|
* <p>
|
||||||
|
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
|
||||||
|
* not liable for any claims arising from secondary or illegal development.
|
||||||
|
* <p>
|
||||||
|
* Author: Chill Zhuang (bladejava@qq.com)
|
||||||
|
*/
|
||||||
|
package org.springblade.auth.granter;
|
||||||
|
|
||||||
|
import org.springblade.core.oauth2.granter.TokenGranter;
|
||||||
|
import org.springblade.core.oauth2.granter.TokenGranterEnhancer;
|
||||||
|
import org.springblade.core.oauth2.granter.TokenGranterFactory;
|
||||||
|
import org.springblade.core.oauth2.props.OAuth2Properties;
|
||||||
|
import org.springblade.core.oauth2.provider.OAuth2Request;
|
||||||
|
import org.springblade.core.oauth2.provider.OAuth2Token;
|
||||||
|
import org.springblade.core.oauth2.service.OAuth2Client;
|
||||||
|
import org.springblade.core.oauth2.service.OAuth2User;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IAM统一身份认证授权器工厂
|
||||||
|
*
|
||||||
|
* @author Chill
|
||||||
|
*/
|
||||||
|
public class IamAwareTokenGranterFactory extends TokenGranterFactory {
|
||||||
|
|
||||||
|
private static final String AUTHORIZATION_CODE = "authorization_code";
|
||||||
|
private static final String IAM_SSO = "iam_sso";
|
||||||
|
|
||||||
|
private final IamSsoTokenGranter iamSsoTokenGranter;
|
||||||
|
private final TokenGranter authorizationCodeGranter;
|
||||||
|
private final List<TokenGranterEnhancer> tokenGranterEnhancers;
|
||||||
|
|
||||||
|
public IamAwareTokenGranterFactory(List<TokenGranter> tokenGranters,
|
||||||
|
List<TokenGranterEnhancer> tokenGranterEnhancers,
|
||||||
|
OAuth2Properties properties) {
|
||||||
|
super(tokenGranters, tokenGranterEnhancers, properties);
|
||||||
|
this.iamSsoTokenGranter = tokenGranters.stream()
|
||||||
|
.filter(IamSsoTokenGranter.class::isInstance)
|
||||||
|
.map(IamSsoTokenGranter.class::cast)
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
this.authorizationCodeGranter = tokenGranters.stream()
|
||||||
|
.filter(tokenGranter -> AUTHORIZATION_CODE.equals(tokenGranter.type()))
|
||||||
|
.filter(tokenGranter -> !(tokenGranter instanceof IamSsoTokenGranter))
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
this.tokenGranterEnhancers = tokenGranterEnhancers;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TokenGranter create(String grantType) {
|
||||||
|
if (IAM_SSO.equals(grantType) && iamSsoTokenGranter != null) {
|
||||||
|
applyEnhancer(grantType, iamSsoTokenGranter);
|
||||||
|
return iamSsoTokenGranter;
|
||||||
|
}
|
||||||
|
if (AUTHORIZATION_CODE.equals(grantType) && iamSsoTokenGranter != null && authorizationCodeGranter != null) {
|
||||||
|
applyEnhancer(grantType, authorizationCodeGranter);
|
||||||
|
applyEnhancer(IAM_SSO, iamSsoTokenGranter);
|
||||||
|
return new IamAwareAuthorizationCodeGranter(iamSsoTokenGranter, authorizationCodeGranter);
|
||||||
|
}
|
||||||
|
return super.create(grantType);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void applyEnhancer(String grantType, TokenGranter tokenGranter) {
|
||||||
|
tokenGranterEnhancers.stream()
|
||||||
|
.filter(enhancer -> grantType.equals(enhancer.type()))
|
||||||
|
.findFirst()
|
||||||
|
.ifPresent(tokenGranter::enhancer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IAM授权码与本系统授权码分流
|
||||||
|
*
|
||||||
|
* @author Chill
|
||||||
|
*/
|
||||||
|
private static class IamAwareAuthorizationCodeGranter implements TokenGranter {
|
||||||
|
|
||||||
|
private final IamSsoTokenGranter iamSsoTokenGranter;
|
||||||
|
private final TokenGranter authorizationCodeGranter;
|
||||||
|
private final ThreadLocal<TokenGranter> currentGranter = new ThreadLocal<>();
|
||||||
|
|
||||||
|
private IamAwareAuthorizationCodeGranter(IamSsoTokenGranter iamSsoTokenGranter, TokenGranter authorizationCodeGranter) {
|
||||||
|
this.iamSsoTokenGranter = iamSsoTokenGranter;
|
||||||
|
this.authorizationCodeGranter = authorizationCodeGranter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String type() {
|
||||||
|
return AUTHORIZATION_CODE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OAuth2Client client(OAuth2Request request) {
|
||||||
|
return resolveGranter(request).client(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OAuth2User user(OAuth2Request request) {
|
||||||
|
TokenGranter tokenGranter = resolveGranter(request);
|
||||||
|
currentGranter.set(tokenGranter);
|
||||||
|
return tokenGranter.user(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OAuth2Token token(OAuth2User user, OAuth2Request request) {
|
||||||
|
try {
|
||||||
|
return currentGranter.get().token(user, request);
|
||||||
|
} finally {
|
||||||
|
currentGranter.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enhancer(TokenGranterEnhancer enhancer) {
|
||||||
|
authorizationCodeGranter.enhancer(enhancer);
|
||||||
|
}
|
||||||
|
|
||||||
|
private TokenGranter resolveGranter(OAuth2Request request) {
|
||||||
|
return iamSsoTokenGranter.supports(request) ? iamSsoTokenGranter : authorizationCodeGranter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user