【问题标题】:Spring Security OAuth2 Authorization Server /oauth/token - 500 No adapter for handlerSpring Security OAuth2 授权服务器 /oauth/token - 500 处理程序没有适配器
【发布时间】:2015-07-21 21:32:33
【问题描述】:

我正在尝试实现 Spring Security 的 OAuth2 授权服务器。尝试访问令牌端点 (/oauth/token) 时,我得到一个 404。我认为我缺少某些东西,但对于我的生活,我看不到它。

我正在使用 Java 配置;

  • Spring Security 4.0.1
  • Spring Security OAuth2 2.0.7

我的配置如下:

ApplicationSecurityConfig.java

用于注册WAR中的配置文件

public class ApplicationSecurityConfig extends 
    AbstractSecurityWebApplicationInitializer {

    public ApplicationSecurityConfig() {
        super(SecurityConfig.class, AuthorizationServerConfig.class);
    }
}

SpringSecurityConfig.java

为与 URL 模式匹配的所有端点配置 httpbasic 身份验证/

@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

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

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

        http
            .authorizeRequests()
            .antMatchers("/")
            .authenticated()
        .and()
            .httpBasic();
    }
}

OauthAuthorizationServerConfig.java

用于配置授权服务器

@Configuration
@EnableAuthorizationServer
public class OauthAuthorizationServerConfig extends 
    AuthorizationServerConfigurerAdapter{

    @Autowired
    private TokenStore tokenStore;  

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

        clients
            .inMemory()
            .withClient("testClient")
            .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);
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception{
        oauthServer.allowFormAuthenticationForClients();
    }

 }

抱歉,如果这是一个“小学生错误”,但我花了一些时间查看 Spring 在 Github 上发布的文档和示例,但我显然误解了一些东西。

--编辑--

我换了 ApplicationSecurityConfig.java 和 SpringApplicationInit.java

public class SpringApplicationInit extends 
    AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {

        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{
            SpringSecurityConfig.class,
            OauthAuthorizationServerConfig.class
        };
    }

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

}

这会产生不同的结果。我现在收到 500 服务器错误状态代码:

javax.servlet.ServletException: No adapter for handler [public org.springframework.http.ResponseEntity<org.springframework.security.oauth2.common.OAuth2AccessToken> org.springframework.security.oauth2.provider.endpoint.TokenEndpoint.getAccessToken(java.security.Principal,java.util.Map<java.lang.String, java.lang.String>) throws org.springframework.web.HttpRequestMethodNotSupportedException]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler
    org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatchrServlet.java:1163)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)

如果代码更易于理解,我已将代码推送到 git 存储库。

【问题讨论】:

  • 你检查过 /oauth/token 的前缀吗?确保它是一个有效的 URI。
  • 是的。我有一些 REST 端点位于 /rest 下,我可以访问它们。
  • 第一次调用 - /oauth/authorize - 有效吗?
  • 我正在使用密码授权,所以第一个调用是令牌端点。一个示例请求是:domain/project/oauth/token?grant_type=password&client_id=testClient&username=user&password=password*
  • 你发送 GET 请求?!

标签: spring oauth spring-security oauth-2.0 spring-security-oauth2


【解决方案1】:

据我所知,您尝试将GET 请求发送到/oauth/token 这是错误的方法。 此端点应接受POST 请求,因此只需使用相同的字段向其发布即可。

【讨论】:

    【解决方案2】:

    Here 是我的minimal 配置示例,用于单独的身份验证和资源服务器 - 只有必要的东西才能完成这项工作。

    【讨论】:

    • 外部链接可能已过期。请将主要内容复制到 SO 并提供链接作为参考。
    猜你喜欢
    • 2015-05-22
    • 2016-07-25
    • 2019-05-18
    • 2018-09-26
    • 2015-03-31
    • 2022-01-14
    • 2021-10-29
    • 2020-03-14
    • 2016-12-12
    相关资源
    最近更新 更多