我有一个基于Spring Security OAuth 2.0的应用程序,配置了JDBC和LDAP。根据OAuth 2.0规范,客户端密钥必须。
当我使用以下URL生成令牌时,它会生成令牌并正常工作:
/oauth/token?grant_type=password&client_secret=test&client_id=test&username=test&password=test
当我尝试生成没有client_secret
的令牌时,它会给出:
401:未经授权
error_description:“糟糕的用户凭据”
但我想生成不带client_secret
的令牌,如:
/oauth/token?grant_type=password&username=test&password=test
securityConfig.java
:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity( prePostEnabled = true )
public class ApplicationSecurityConfig extends WebSecurityConfigurerAdapter {
private static final int EMBEDDED_LDAP_SERVER_PORT = 33388;
@Autowired
private UserAuthenticationProvider userAuthenticationProvider;
@Autowired
private LdapAuthenticationProvider ldapAuthenticationProvider;
@Autowired
private AuthTokenStore oAuthTokenStore;
@Autowired
private AuthDelegatingAuthenticationEntryPoint delegatingAuthenticationEntryPoint;
@Override
@Qualifier("authenticationManagerBean")
@Bean
protected AuthenticationManager authenticationManager() throws Exception {
return new ProviderManager(Arrays.asList((AuthenticationProvider) ldapAuthenticationProvider,userAuthenticationProvider));
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.anyRequest().authenticated()
.and()
.exceptionHandling().authenticationEntryPoint(delegatingAuthenticationEntryPoint);
}
@Bean
public ResourceServerTokenServices tokenService() {
DefaultTokenServices tokenServices = new DefaultTokenServices();
tokenServices.setTokenStore(oAuthTokenStore);
tokenServices.setReuseRefreshToken(true);
return tokenServices;
}
答案 0 :(得分:-1)
不幸的是,没有简单的解决方法。 Spring安全性非常严格地解释标准:
这是来自OAuth2规范的引用,RFC 6749, section 4.3.2 (Resource Owner Password Credentials Grant - Access Token Request):
如果客户类型是保密的或客户是发给客户的 凭证(或指定的其他认证要求),
客户端必须按授权服务器进行身份验证,如上所述 在第3.2.1节中。
对于spring security,密码授予始终属于此类别。第3.2.1节要求客户端ID和客户端密码。
Spring安全文档也是这样的: 28.1.1 Authorization Server
除非您想更改spring security的OAuth2(不推荐)的身份验证逻辑,否则您将被卡住。
从我的观点来看,没有问题。客户端ID和密码无需任何成本,并为您的应用程序带来更多安全性。