我使用Spring OAuth2保护我的REST API并实现了client_credentials,密码授予类型。除了在POST主体中使用用户凭据的ResourceOwnerPassword流之外,它们的工作完全正常。
使用以下URL进行令牌端点调用是正常的(如果我们将用户凭据作为URL参数发送) HTTP POST:/ oauth / token?grant_type = password& username = 123& password = 456
但是通过以下设置,我的Authentication.getCredentials和Authentication.getPrincipal对象始终为空。我正在使用自定义身份验证提供程序,因为我需要针对外部LDAP系统验证用户。
这是否意味着用户凭据(Usernamd和密码)只能在URL参数中发送到令牌端点(/ oauth / token)?
我的配置是:
授权服务器配置:
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
tokenEnhancerChain.setTokenEnhancers(
Arrays.asList(new CustomTokenEnhancer(), accessTokenConverter));
endpoints
.tokenStore(tokenStore).tokenEnhancer(tokenEnhancerChain)
.userApprovalHandler(userApprovalHandler)
.authenticationManager(userAuthenticationManager);
}
@Bean
AuthenticationManager userAuthenticationManager() {
List<AuthenticationProvider> authenticationProviders = new ArrayList<AuthenticationProvider>();
authenticationProviders.add(new CustomAuthenticationProvider()));
return new ProviderManager(authenticationProviders);
}
自定义身份验证提供程序:
@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
System.out.println("authentication object........"+authentication);
String userName;
String password;
System.out.println("authentication object credentials........"+authentication.getCredentials());
userName = authentication.getName();
password = authentication.getCredentials().toString();
}
在控制台中打印验证对象:
org.springframework.security.authentication.Usernam ePasswordAuthenticationToken @ 7a2162f9:Principal:null;证书:[受保护] ;认证:false;详情:{grant_type =密码};没有授予任何权力
但是,我确实发现了一个帖子,他们说请求体中的用户凭据与Token端点一起使用..这是关于它的链接..
https://github.com/spring-projects/spring-security-oauth/issues/260
按照上面的说法,我似乎错过了一些东西..
任何帮助/提示都将受到赞赏..