2016-04-26 11 views
10

Spring MVCアプリケーションでexpired-urlを設定する必要があります。ここに私の努力はあるが、効果はありません。スプリングセキュリティ - expiredUrlが動作しない

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
     .addFilterBefore(adminAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) 
     .addFilterBefore(customerAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) 
     .csrf() 
      .disable() 
     .authorizeRequests() 
      .antMatchers("...", "...", "...").permitAll() 
      .anyRequest().authenticated() 
     .and() 
      .formLogin() 
       .loginPage("/admin/login") 
     .and() 
      .logout() 
       .addLogoutHandler(customLogoutHandler()) 
       .logoutSuccessHandler(customLogoutSuccessHandler()) 
       .logoutUrl("/logout") 
     .deleteCookies("remove") 
     .invalidateHttpSession(true) 
      .permitAll() 
     .and() 
     .sessionManagement() 
      .maximumSessions(1) 
      .expiredUrl("/expired"); 

} 

これは、任意の効果やユーザーのセッション時間を持っていない、春は/expired URLに彼をリダイレクトし、ちょうど/admin/login URLに彼をリダイレクトしません。

更新:

私はコメント、答えで提案されたソリューションを試みたが、何の効果も見ませんでした。また、方法の開始時にaddLogoutHandler(),logoutSuccessHandler()および2つのaddFilterBefore()を削除しましたが、機能しません。

はまた、私はこのように別の解決策を試してみました:

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
     .addFilterBefore(sessionManagementFilter(), SessionManagementFilter.class) 
     .csrf() 
      .disable() 
     .authorizeRequests() 
      .antMatchers("...", "...", "...").permitAll() 
      .anyRequest().authenticated() 
     .and() 
      .formLogin() 
       .loginPage("/admin/login") 
     .and() 
      .logout() 
       .logoutUrl("/logout") 
     .deleteCookies("remove") 
     .invalidateHttpSession(true) 
      .permitAll(); 
} 

@Bean 
public SessionManagementFilter sessionManagementFilter() { 
    SessionManagementFilter sessionManagementFilter = new SessionManagementFilter(httpSessionSecurityContextRepository()); 
    sessionManagementFilter.setInvalidSessionStrategy(simpleRedirectInvalidSessionStrategy()); 
    return sessionManagementFilter; 
} 

@Bean 
public SimpleRedirectInvalidSessionStrategy simpleRedirectInvalidSessionStrategy() { 
    SimpleRedirectInvalidSessionStrategy simpleRedirectInvalidSessionStrategy = new SimpleRedirectInvalidSessionStrategy("/expired"); 
    return simpleRedirectInvalidSessionStrategy; 
} 

@Bean 
public HttpSessionSecurityContextRepository httpSessionSecurityContextRepository(){ 
    HttpSessionSecurityContextRepository httpSessionSecurityContextRepository = new HttpSessionSecurityContextRepository(); 
    return httpSessionSecurityContextRepository; 
} 

は、誰もがこの問題を解決するために私を助けてもらえますか?

+3

@hamed、オーケー..私はあなたが '/ expired'のURLを(私はこれが有効期限のURLであるため、これは厄介である知っているアクセスするために必要な権限がありませんね!処理することに苦しんではいけません..'.antMatchers( "/ expired"、 "..."、...)を追加してみてください。permitAll () 'をクリックして、今すぐあなたが有効期限切れのページにリダイレクトされたのか、それともまだログインページにリダイレクトされているのかを確認してください。 –

答えて

8

:まず、あなたは春のセキュリティは、セッションライフサイクルイベントについての最新の状態に保つためにあなたのweb.xmlファイルに次のリスナーを追加する必要があります。

.sessionManagement().maximumSessions(1).and().invalidSessionUrl("/expired"); 

としてコーダーは許可されたURLに"/expired"を追加し、問題が解決、と述べました。私の問題に注意を払った皆さん、特にアリデハガニコーダー、ありがとうございました。

0

UXは、ユーザーをログインページにリダイレクトするのが理想的です。別のログインマスクを使用する必要があることを知ったSpring MVC - change security settings dynamicallyのために、専用の/期限切れのページが必要なことがわかります。回避策(私はあなたの他の質問に私の答えで説明したもの)があなたのために働く場合、あなたは、専用の/期限切れのページを持って、正しいログインページに直接リダイレクトするあなたの要件をドロップする可能性があります2)。どのようにそのことについて?それでも

、あなたの現在の質問に答えるために... 私はわからないんだけど、それが動作するかどうかが、場合

 //... 
     .sessionManagement().sessionFixation().newSession().maximumSessions(1) 
     .expiredUrl("/expired") 
     .sessionRegistry(sessionRegistry()); 
    } 

    @Bean 
    public SessionRegistry sessionRegistry() { 
     SessionRegistry sessionRegistry = new SessionRegistryImpl(); 
     return sessionRegistry; 
    } 

にそれを

 //... 
     .sessionManagement() 
     .maximumSessions(1) 
     .expiredUrl("/expired"); 
    } 

をそれを試してみると、あなたのコードを変更うまくいかない場合は、customLogoutHandler()customLogoutSuccessHandler()のコードを投稿できますか?あなたはSpring Bootの外でSpring MVCを使用していますが、正しいですか? SessionRegistryで期限切れとしてvalidセッションIDがマークされている場合

+0

'customLogoutHandler()'と 'customLogoutSuccessHandler()'を削除してあなたの解決策を試しましたが、何の効果も見ませんでした。セッションがタイムアウトすると、springが私をログインURLにリダイレクトします。 – hamed

5

ConcurrentSessionFilterSpring Security referenceを参照してください、expiredUrlにリダイレクトします:

- 期限切れの-URL URL、彼らが使用しようとすると、ユーザーがリダイレクトされますユーザーが許可されたセッションの数を超えて別の場所に再度ログインしたために、同時セッションコントローラによって「期限切れになった」セッション。 exception-if-maximum-exceededが設定されていない場合に設定する必要があります。値が指定されない場合、有効期限メッセージは応答に直接書き込まれます。セッションIDがvalid(タイムアウトまたは間違ったID)ではない場合

SessionManagementFilterは、invalidSessionUrlにリダイレクトされます、Spring Security referenceを参照してください。

ユーザーが現在認証されていない場合、フィルタが無効かどうかをチェックします(例えばタイムアウトのために)セッションIDが要求されており、コンフィグレーションされたInvalidSessionStrategyが設定されている場合はそのセッションが呼び出されます。最も一般的な動作は固定URLにリダイレクトすることです。これは標準実装SimpleRedirectInvalidSessionStrategyにカプセル化されています。後者は、前に説明したように、名前空間を通じて無効なセッションURLを構成する場合にも使用されます。

両方のURL(expiredUrlinvalidSessionUrl)はpermitAll()ように構成されなければなりません。ところで

:あなたはmaximumSessionsConcurrent Session Controlを使用したい場合は、あなたのweb.xmlHttpSessionEventPublisherを追加する必要があります。

並行セッション制御

あなたが単一ユーザの能力に制約を配置したい場合アプリケーションにログインすると、Spring Securityは以下の簡単な追加でこれをそのまま使用できます。私はこのように(コメントで)アリDehghaniのソリューションを試してみました

​​
0

UserDetailsUserDetailsServiceを使用する場合は、UserDetails実装クラスには、hashCode()メソッドとequals(Object obj)メソッドがオーバーライドされていないことが必要です。これはUserDetailsのための私の実装クラスです:

public class MyUser implements UserDetails { 
    private String username; 

    private String password; 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    @Override 
    public Collection<? extends GrantedAuthority> getAuthorities() { 
     return null; 
    } 

    @Override 
    public String getPassword() { 
     return null; 
    } 

    @Override 
    public String getUsername() { 
     return null; 
    } 

    @Override 
    public boolean isAccountNonExpired() { 
     return false; 
    } 

    @Override 
    public boolean isAccountNonLocked() { 
     return false; 
    } 

    @Override 
    public boolean isCredentialsNonExpired() { 
     return false; 
    } 

    @Override 
    public boolean isEnabled() { 
     return false; 
    } 

    @Override 
    public int hashCode() { 
     return username.hashCode(); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     return this.toString().equals(obj.toString()); 
    } 
} 
関連する問題