2012-08-13 17 views
41

リクエストごとにいくつかの情報を受け取りたいので、リクエストごとに機能を持たせ、リクエストからこれらの情報を別々に取得するのではなく、の方が良いでしょう。
すべてのリクエストがそのフィルタを通過し、私が望むものが得られます。


質問:私はどのようにカスタムフィルタを書くことができますか?
あらかじめ定義されたスプリングセキュリティフィルタと似ていないものとし、まったく新しいものとします。春のセキュリティでカスタムフィルタを書くには?

答えて

42

標準のJavaフィルタを使用できます。 web.xmlに認証フィルタの後に置くだけです(これは、後でフィルタチェーンに入り、セキュリティフィルタチェーンの後に呼び出されることを意味します)。 web.xmlファイルの

public class CustomFilter implements Filter{ 

    @Override 
    public void destroy() { 
     // Do nothing 
    } 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, 
      FilterChain chain) throws IOException, ServletException { 

      HttpServletRequest request = (HttpServletRequest) req; 

      Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 

      Set<String> roles = AuthorityUtils.authorityListToSet(authentication.getAuthorities()); 
      if (roles.contains("ROLE_USER")) { 
       request.getSession().setAttribute("myVale", "myvalue"); 
      } 

      chain.doFilter(req, res); 

    } 

    @Override 
    public void init(FilterConfig arg0) throws ServletException { 
     // Do nothing 
    } 

} 

フラグメント:

<!-- The Spring Security Filter Chain --> 
<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<!-- Your filter definition --> 
<filter> 
    <filter-name>customFilter</filter-name> 
    <filter-class>com.yourcompany.test.CustomFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>customFilter</filter-name> 
    <url-pattern>/VacationsManager.jsp</url-pattern> 
</filter-mapping> 

また、あなたは(あなたがSavedRequestAwareAuthenticationSuccessHandlerを拡張する必要があります)成功した​​ログイン後に呼び出されるハンドラを追加することができます。 Look hereこれを行う方法。そして、これはもっと良いアイデアだと思います。
それとも、このようなあなたのセキュリティフィルタの最後にこのフィルタを持つことができます:更新された



<security:filter-chain-map> 
    <sec:filter-chain pattern="/**" 
      filters=" 
     ConcurrentSessionFilterAdmin, 
     securityContextPersistenceFilter, 
     logoutFilterAdmin, 
     usernamePasswordAuthenticationFilterAdmin, 
     basicAuthenticationFilterAdmin, 
     requestCacheAwareFilter, 
     securityContextHolderAwareRequestFilter, 
     anonymousAuthenticationFilter, 
     sessionManagementFilterAdmin, 
     exceptionTranslationFilter, 
     filterSecurityInterceptorAdmin, 
     MonitoringFilter"/> <!-- Your Filter at the End --> 
</security:filter-chain-map> 

そして、あなたのフィルターを持つことを、あなたはこれを使用することがあります。

public class MonitoringFilter extends GenericFilterBean{ 
@Override 
public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
    //Implement this Function to have your filter working 
} 
+0

私は答えを待っていたので、私は解決策を考え出しました。セキュリティフィルタの最後にフィルタ(拡張 'GenericFilterBean')を追加しました。それはうまく働いています。しかし、今、私はあなたの答えを見て、それは私には良い音。私はあなたの解決策を試しています。それもうまくいくと思っています。私はあなたに結果を知らせます。ありがとう。 –

+0

一般的にあなたの答えは正しいですが、少し修正する必要があります。ご協力いただきありがとうございます。 –

+0

私の不信を修正して、私はあなたの変更を受け入れます。私が間違っていた場所を知ることは興味深いことです。 – dimas

13

これをミックスに投げ込む。どうすればいいですかcustom-filterの中にhttp要素:

<security:http auto-config="false" ...> 
    ... 
    <security:custom-filter position="FORM_LOGIN_FILTER" ref="MyCustomFilter" /> 
</security:http> 
+1

これははるかに良い解決策です。私はそれ以外のものの前に自分自身のフィルタを実行したかったのです。

関連する問題