【问题标题】:can't reach /oauth/token spring security for rest api无法达到/oauth/token spring security for rest api
【发布时间】:2015-04-26 01:27:47
【问题描述】:

我正在关注一些使用 Spring Security 保护 REST api 的示例(通过配置而不是 XML)。 我有以下课程:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserManager userManager;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userManager);
    }

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

@Configuration
@EnableAuthorizationServer
public class OAuthConfiguration extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

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

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

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource);
    }
}

当然还有我的UserManager extends UserDetailsService

当我尝试拨打电话以检索已注册用户的用户时,

GET http://localhost:8080/oauth/token?grant_type=password&username=be@gmail.com&password=123

I get: 404 - page not found.

怎么了?

已编辑: 我的 web.xml。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <filter>
        <filter-name>CorsFilter</filter-name>
        <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
        <init-param>
            <param-name>cors.allowed.origins</param-name>
            <param-value>*</param-value>
        </init-param>
        <init-param>
            <param-name>cors.allowed.methods</param-name>
            <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
        </init-param>
        <init-param>
            <param-name>cors.allowed.headers</param-name>
            <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
        </init-param>
        <init-param>
            <param-name>cors.exposed.headers</param-name>
            <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
        </init-param>
        <init-param>
            <param-name>cors.support.credentials</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>cors.preflight.maxage</param-name>
            <param-value>10</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CorsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

   <!-- do not change the order. Static should be served before any other -->
    <context-param>
        <param-name>contextClass</param-name>
        <param-value>
            org.springframework.web.context.support.AnnotationConfigWebApplicationContext
        </param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>com.estartup.config.PersistenceConfig</param-value>
    </context-param>

    <!-- Bootstrap the root application context as usual using ContextLoaderListener -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>jersey-servlet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.estartup.config.AlgopixApplication</param-value>
        </init-param>

        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>jersey-servlet</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>
</web-app>

【问题讨论】:

  • 也分享你的web.xml 和 spring security/oauth config xml。我怀疑那里可能有问题。
  • 我添加了 web.xml。我没有 spring-securty/oath config xml - 我在 @configuration 类中定义了它
  • 之前遇到过类似的问题,我记得我在web.xml 的设置中缺少这个问题。您可以尝试添加它。 &lt;servlet&gt; &lt;servlet-name&gt;spring&lt;/servlet-name&gt; &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; &lt;/servlet&gt; 另外,不知道为什么 URL 中缺少应用名称。
  • app-name 丢失,因为 server.xml 中的文档库是 /。我将尝试添加 servlet。如果我使用@configuration,不知道为什么需要它
  • 我添加了 servlet 但没有帮助

标签: java spring rest oauth spring-security


【解决方案1】:

您是否尝试使用 REST-client 来调用调用?

另外,我认为 URL 中缺少应用程序名称 - 应该类似于 GET

http://localhost:8080/<app-name>/oauth/token?grant_type=password&username=be@gmail.com&password=123

【讨论】:

  • 是的。我正在使用客户端。无需像 server.xml 中那样定义应用程序名称,文档库是 /
  • 所以auth-server是"/",那么资源服务器和客户端app呢?
  • 我没有收到最后一条评论。客户端应用程序 - 这是一个休息 api。
  • 我的意思是 oauth-client 和 oauth-resource-server
  • 你能详细说明一下吗?我只有一个 Jersey rest-api
【解决方案2】:

我必须补充:

<servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/oauth/token</url-pattern>
    </servlet-mapping>

映射servlet。为什么不能通过@configuration来完成?

【讨论】:

  • 发布您的 beans.xml...这样分析会更容易...您添加了 吗?
  • 我在@configuration 文件中有@ComponentScan({ "com.estartup" })
猜你喜欢
  • 2017-05-13
  • 2018-07-22
  • 2018-04-26
  • 2017-09-25
  • 2014-09-29
  • 1970-01-01
  • 2018-10-16
  • 2023-03-08
  • 2016-09-10
相关资源
最近更新 更多