2 changed files with 76 additions and 0 deletions
@ -0,0 +1,74 @@
|
||||
package org.springblade.auth.granter; |
||||
|
||||
import org.springblade.auth.utils.TokenUtil; |
||||
import org.springblade.common.cache.CacheNames; |
||||
import org.springblade.core.redis.cache.BladeRedis; |
||||
import org.springblade.core.tool.utils.StringUtil; |
||||
import org.springblade.core.tool.utils.WebUtil; |
||||
import org.springframework.security.authentication.*; |
||||
import org.springframework.security.core.Authentication; |
||||
import org.springframework.security.oauth2.common.exceptions.InvalidGrantException; |
||||
import org.springframework.security.oauth2.common.exceptions.UserDeniedAuthorizationException; |
||||
import org.springframework.security.oauth2.provider.*; |
||||
import org.springframework.security.oauth2.provider.token.AbstractTokenGranter; |
||||
import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import java.util.LinkedHashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* 本地内部服务TokenGranter |
||||
* |
||||
* @author Chill |
||||
*/ |
||||
public class LocalServerTokenGranter extends AbstractTokenGranter { |
||||
|
||||
private static final String GRANT_TYPE = "localserver"; |
||||
|
||||
private final AuthenticationManager authenticationManager; |
||||
|
||||
private BladeRedis bladeRedis; |
||||
|
||||
public LocalServerTokenGranter(AuthenticationManager authenticationManager, |
||||
AuthorizationServerTokenServices tokenServices, ClientDetailsService clientDetailsService, OAuth2RequestFactory requestFactory, BladeRedis bladeRedis) { |
||||
this(authenticationManager, tokenServices, clientDetailsService, requestFactory, GRANT_TYPE); |
||||
this.bladeRedis = bladeRedis; |
||||
} |
||||
|
||||
protected LocalServerTokenGranter(AuthenticationManager authenticationManager, AuthorizationServerTokenServices tokenServices, |
||||
ClientDetailsService clientDetailsService, OAuth2RequestFactory requestFactory, String grantType) { |
||||
super(tokenServices, clientDetailsService, requestFactory, grantType); |
||||
this.authenticationManager = authenticationManager; |
||||
} |
||||
|
||||
@Override |
||||
protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, TokenRequest tokenRequest) { |
||||
HttpServletRequest request = WebUtil.getRequest(); |
||||
|
||||
|
||||
Map<String, String> parameters = new LinkedHashMap<String, String>(tokenRequest.getRequestParameters()); |
||||
String username = parameters.get("username"); |
||||
String password = parameters.get("password"); |
||||
// Protect from downstream leaks of password
|
||||
parameters.remove("password"); |
||||
|
||||
Authentication userAuth = new UsernamePasswordAuthenticationToken(username, password); |
||||
((AbstractAuthenticationToken) userAuth).setDetails(parameters); |
||||
try { |
||||
userAuth = authenticationManager.authenticate(userAuth); |
||||
} |
||||
catch (AccountStatusException | BadCredentialsException ase) { |
||||
//covers expired, locked, disabled cases (mentioned in section 5.2, draft 31)
|
||||
throw new InvalidGrantException(ase.getMessage()); |
||||
} |
||||
// If the username/password are wrong the spec says we should send 400/invalid grant
|
||||
|
||||
if (userAuth == null || !userAuth.isAuthenticated()) { |
||||
throw new InvalidGrantException("Could not authenticate user: " + username); |
||||
} |
||||
|
||||
OAuth2Request storedOAuth2Request = getRequestFactory().createOAuth2Request(client, tokenRequest); |
||||
return new OAuth2Authentication(storedOAuth2Request, userAuth); |
||||
} |
||||
} |
Loading…
Reference in new issue