2015-02-24 86 views
0

我正在遵循幾個例子來保護與彈簧安全REST API(通過配置不XML)。 我有以下類別:無法達到/ oauth /令牌彈簧安全性爲休息api

@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&[email protected]&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> 
+0

還分享你的'web.xml'和spring security/oauth config xml。我懷疑那裏可能有錯。 – 2015-02-24 12:24:02

+0

我添加了web.xml。我沒有spring-securty/oath config xml - 我在@configuration類中定義了它 – Dejell 2015-02-24 12:26:02

+0

以前遇到過類似的問題,我記得我在'web.xml'的設置中缺少這個。你可以嘗試添加它。 ' 彈簧 org.springframework.web.servlet.DispatcherServlet <負載上啓動> 1 ' 此外,不知道爲什麼應用程序名稱在URL中丟失。 – 2015-02-24 12:30:22

回答

0

我不得不添加:

<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完成?

+0

發佈您的beans.xml ...它會更容易分析...您是否添加了? – OhadR 2015-02-24 14:15:05

+0

@configuration文件中有@ComponentScan({「com.estartup」}) – Dejell 2015-02-24 14:20:23

0

您是否嘗試使用REST客戶端來調用該呼叫?

加,我認爲應用程序名稱在URL中缺少 - 是應該像GET

http://localhost:8080/<app-name>/oauth/token?grant_type=password&[email protected]&password=123 
+0

是的。我正在使用客戶端。無需像在server.xml中那樣定義應用程序名稱,文檔庫是/ – Dejell 2015-02-24 12:31:50

+0

,因此auth-server是「/」,那麼資源服務器和客戶端應用程序又如何? – OhadR 2015-02-24 14:12:23

+0

我沒有得到最後的評論。客戶端應用程序 - 這是一個休息API。 – Dejell 2015-02-24 14:19:14