Spring Security OAuth2 授权服务器 /oauth/token - 500 处理程序没有适配器

Posted

技术标签:

【中文标题】Spring Security OAuth2 授权服务器 /oauth/token - 500 处理程序没有适配器【英文标题】:Spring Security OAuth2 Authorization Server /oauth/token - 500 No adapter for handler 【发布时间】: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 请求?! 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

外部链接可能已过期。请将主要内容复制到 SO 并提供链接作为参考。

以上是关于Spring Security OAuth2 授权服务器 /oauth/token - 500 处理程序没有适配器的主要内容,如果未能解决你的问题,请参考以下文章

针对授权标头的Spring Security OAuth2 CORS问题

Spring Security OAuth2 - 将参数添加到授权 URL

Spring Security实现OAuth2.0授权服务 - 进阶版

Spring security OAuth2 资源服务器 JWT 授权错误

Spring Security OAuth2.0认证授权

Spring Security OAuth2.0认证授权