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授权服务 - 进阶版