gpt4 book ai didi

java - 没有这样的客户端异常 Spring Oauth2

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:43:39 25 4
gpt4 key购买 nike

我正在尝试使用 Java 配置实现 Spring Security OAuth2。

我的用例需要使用密码 grant_type。

到目前为止,我已经配置了这个,不需要 web.xml 并且更愿意保持这种状态

我使用的版本:

  • Spring 框架:4.1.6
  • Spring 安全:4.0.1
  • Spring Security OAuth:2.0.7

为了更容易解释这一点,我在 token 端点上启用了 GET

    @Override
public void configure
(AuthorizationServerEndpointsConfigurer endpoints) throws Exception
{
endpoints
.tokenStore(tokenStore)
.authenticationManager(authenticationManager)
.allowedTokenEndpointRequestMethods(HttpMethod.GET); //<-- Enable GET
}

我提出的要求如下:

http://localhost:8080/project/oauth/token?
client_id=testClient&
grant_type=password&
username=user&
password=password

header 包括授权 header ,其中包含以下编码版本:

Username: user
Password: password

我得到的异常是:

HTTP Status 500 - Request processing failed; nested exception is
org.springframework.security.oauth2.provider.NoSuchClientException:
No client with requested id: user

从异常描述看来,OAuth 正在 ClientDetailsS​​ervice 中查找客户端:用户。然而,user 是一个用户凭证。我显然对配置有一些误解。

我的配置如下;

ServletInitializer.java

public class ServletInitializer extends AbstractDispatcherServletInitializer {

@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.scan(ClassUtils.getPackageName(getClass()));
return context;
}

@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}

@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}

@Override
public void onStartup(ServletContext servletContext) throws ServletException{
super.onStartup(servletContext);
DelegatingFilterProxy filter = new DelegatingFilterProxy("springSecurityFilterChain");
filter.setContextAttribute("org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcher");
servletContext.addFilter("springSecurityFilterChain", filter).addMappingForUrlPatterns(null, false, "/*");
}
}

WebMvcConfig.java

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}

SecurityConfiguration.java

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Autowired
public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception{
auth.
inMemoryAuthentication()
.withUser("user")
.password("password")
.roles("USER");
}

@Override
protected void configure(HttpSecurity http) throws Exception{
http
.authorizeRequests()
.antMatchers("/Services/*")
.authenticated()
.and()
.httpBasic();
}

@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}

}

OAuth2ServerConfig.java

@Configuration
public class OAuth2ServerConfig {

@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter{

@Autowired
private TokenStore tokenStore;

@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception{

clients
.inMemory()
.withClient("testClient")
.secret("secret")
.scopes("read", "write")
.authorities("ROLE_CLIENT")
.authorizedGrantTypes("password", "refresh_token")
.accessTokenValiditySeconds(60)
.refreshTokenValiditySeconds(3600);
}

@Bean
public TokenStore tokenStore() {
return new InMemoryTokenStore();
}

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception{
endpoints
.tokenStore(tokenStore)
.authenticationManager(authenticationManager)
.allowedTokenEndpointRequestMethods(HttpMethod.GET);
}

@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {

}
}

@Configuration
@EnableResourceServer
protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

@Override
public void configure(ResourceServerSecurityConfigurer resources){
resources.resourceId("SomeResourseId").stateless(false);
}

@Override
public void configure(HttpSecurity http) throws Exception{

http
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.and()
.authorizeRequests()
.antMatchers("/secure/**").access("#oauth2.hasScope('read')");
}
}
}

gitrepo 中的代码以便于访问:https://github.com/dooffas/springOauth2

最佳答案

我不确定您的案例中的 500 来自哪里。我看到一个 406,因为访问 token 没有 JSON 转换器(Spring 过去默认为 Jackson 1.* 注册一个转换器。* 但现在它只为 Jackson 2.* 注册)。如果我将 jackson-databind 添加到类路径,你的 token 端点对我有用,例如

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.4</version>
<scope>runtime</scope>
</dependency>

这对我有用:

$ curl -v testClient:secret@localhost:8080/oauth/token?'grant_type=password&username=user&password=password'

附言您真的不应该将 GET 用于 token 请求。

关于java - 没有这样的客户端异常 Spring Oauth2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30211379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com