2017-04-16 21 views
0

私は、スプリングブートを使用して、スプリングRESTアプリケーションを開発しています。私は、角JSクライアントを使用してSpring REST APIを使用しています。スプリングブートレストCORSのスプリングセキュリティ認証の問題

私が使用しているスタックは次のとおりです。

Spring Boot 1.4.2 , Spring Security , Angular JS , Tomcat 8 

私の問題です:

1)ログイン時、ユーザーが正常に認証されます。カスタム認証成功ハンドラは200個のステータスコードを返します。

2)クリントはproctedリソースにアクセスするための別の要求を送信するときに認証成功後、HttpSessionのが

3 NULLである)SecurityContextPersistenceFilterHttpSessionからSecurityContextを取得しようとすると、それがヌルと として返されるためたと再びサーバは/loginリソース

4)に要求を送信しますので、私の質問は以下のとおりです。

1)なぜhttpsesionは、2番目の要求のためにnullであるのですか?

2)私は、春のセキュリティが、最初の成功認証後にクッキーとしてJSESSIONIDを返すことを確認しました。

3)その後、クライアントはこのJSESSIONIDを要求していないので、2番目の要求は同じセッションにはなりません。

4)SESSIONが設定されていない場合、SecurityContextはどのように取得されますか?

私はここに

EDIT 1続行することはできませんよよう助けてください:

を私は春のセキュリティが提供するメモリのユーザーにデフォルトを使用しています。私のセキュリティ設定が怒鳴るです:スローされauthenticated発現とアクセス拒否の例外のためにfalseを返すAccessDecisionVoterAbstractSecurityInterceptor:要求は今で失敗している

org.sprin[email protected]9055c2bc: 
Principal: anonymousUser; Credentials: [PROTECTED]; 
Authenticated: true; 
Details: org.sprin[email protected]b364: 
RemoteIpAddress: 0:0:0:0:0:0:0:1; 
SessionId: null; 
Granted Authorities: ROLE_ANONYMOUS 

:私は認証されたユーザとして、ユーザの下に取得しています

@Configuration 
@EnableWebSecurity 
@ComponentScan({"com.atul.security"}) 
public class SecurityConfig extends WebSecurityConfigurerAdapter{ 

    @Autowired 
    private RESTAuthenticationSuccessHandler authenticationSuccessHandler; 


    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
      http 
      .formLogin().successHandler(authenticationSuccessHandler) 
      .and() 
      .csrf().disable() 
      .authorizeRequests() 
      .antMatchers(HttpMethod.OPTIONS,"/*").permitAll() 
      .antMatchers("/index.html", "/home.html", "/login.html", "/").permitAll() 
      .anyRequest().authenticated() 
      .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); 
    } 

} 

+0

csrfトークンのセキュリティを無効にしましたか? –

+0

はい私は春のセキュリティを設定している間にそれをしました – Atul

+1

@Atul:これの意味を知っていますか:()。sessionManagement()。sessionCreationPolicy(SessionCreationPolicy.STATELESS); –

答えて

1

RESTFULサービスが状態を維持しないため、セッションが休止していませんこのスタックオーバーフローのポストを読んでください:

Do sessions really violate RESTfulness?

このチュートリアルを調べて春のセキュリティサービスベースのRESTを構築する方法を正しく知りたい場合は、次の

http://www.baeldung.com/securing-a-restful-web-service-with-spring-security

このことができますことを願っています。

あなたはformLoginセキュリティを使用しています。つまり、ユーザーを認証するために何らかの種類のデータストアを追加する必要があります。ここで

は春のドキュメントからインメモリデータストアのための例です。この例によれば

@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Bean 
    public UserDetailsService userDetailsService() throws Exception { 
     InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); 
    manager.createUser(User.withUsername("user").password("password").roles("USER").build()); 
    manager.createUser(User.withUsername("admin").password("password").roles("USER","ADMIN").build()); 
    return manager; 
} 

} 

、あなたはあなたがいる

パスワードのユーザのユーザ名とパスワードで認証に成功すると仮定しますあなたのフロントテクノロジとしてangleJSのセキュリティを適用しようとすると、それを達成するための偉大なチュートリアルがあります。すでに私のプロジェクトに実装しています。

https://spring.io/guides/tutorials/spring-security-and-angular-js/

初心者はセキュリティ認証方法としてhttpBasicを使用し、formLoginは使用しないでください。

+0

を試してみますsessionCreationPolicy(SessionCreationPolicy.STATELESS)を試しました。リクエストはUsernamePasswordAuthenticationFilterを通過しています。問題は次のとおりです。.anyRequest()。authenticated()はfalseを返し、アクセス拒否例外がスローされます。 – Atul

+0

ユーザーを認証するためのデータソース(メモリ内またはデータベース)がありますか? –

+0

私はSpring Security - Spring Bootによって提供されるデフォルトのユーザーを使用しています。 – Atul

0

長時間ヘッドを叩いた後、私は最後に解決策を見つけることができました。

手順は次のとおりです。 1)フォームベースのログインでは、セッションを確立する必要があります。認証に成功すると、サーバーは応答としてSet-Cookie:JSESSIONID=3974317C6DE34865B6726FCFD4C98C08; Path=/springbootrest; HttpOnlyヘッダーを送信します。

2)ブラウザがリクエストごとに他のそこにはセッションが確立されず、認証が

3を失敗します)しかし、私はCORSを使用していたので、このヘッダを送信する必要がある(私のサーバーとUIアプリはローカル上の別のポートに常駐しますシステム)、ブラウザは認証に失敗した要求でCookie:JSESSIONID=3974317C6DE34865B6726FCFD4C98C08を送信していませんでした。

4)ブラウザが要求に応じてヘッダを送信し始めた後に、角度のjsクライアントに以下の行を追加する必要があります($httpProvider.defaults.withCredentials = true;)。

5)サーバー側では、以下のコードをCORSFilterに追加する必要があります。

response.setHeader("Access-Control-Allow-Credentials","true"); 
     response.setHeader("Access-Control-Allow-Origin", "http://localhost:8186"); 
     response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE"); 
     response.setHeader("Access-Control-Max-Age", "3600"); 
     response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, WWW-Authenticate, Authorization, Origin, Content-Type, Version"); 
     response.setHeader("Access-Control-Expose-Headers", "X-Requested-With, WWW-Authenticate, Authorization, Origin, Content-Type"); 

     final HttpServletRequest request = (HttpServletRequest) req; 
     if("OPTIONS".equalsIgnoreCase(request.getMethod())) { 
      response.setStatus(HttpServletResponse.SC_OK); 
     } else { 
      chain.doFilter(req, res); 
     } 
関連する問題