2012-08-13 41 views
41

Tôi muốn nhận một số thông tin theo yêu cầu, vì vậy tôi nghĩ thay vì có chức năng cho từng yêu cầu và lấy thông tin đó từ yêu cầu riêng, thì tốt hơn là nên có bộ lọc.
Vì vậy, mọi yêu cầu sẽ vượt qua bộ lọc đó và tôi đạt được những gì tôi muốn.


Câu hỏi đặt ra là: Làm cách nào để viết bộ lọc tùy chỉnh?
Giả sử nó không giống như bất kỳ bộ lọc bảo mật mùa xuân được xác định trước nào và nó hoàn toàn mới.Làm thế nào để viết một bộ lọc tùy chỉnh trong bảo mật mùa xuân?

Trả lời

42

Bạn có thể sử dụng bộ lọc Java chuẩn. Chỉ cần đặt nó sau khi bộ lọc xác thực trong web.xml (điều này có nghĩa là nó sẽ đi sau trong chuỗi bộ lọc và sẽ được gọi sau chuỗi bộ lọc bảo mật).

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 
    } 

} 

Fragment của web.xml:

<!-- 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> 

Ngoài ra bạn có thể thêm xử lý này sẽ được gọi sau khi đăng nhập thành công (bạn cần phải mở rộng SavedRequestAwareAuthenticationSuccessHandler). Look here cách thực hiện việc này. Và tôi nghĩ rằng đây thậm chí còn là ý tưởng tốt hơn.


CẬP NHẬT:
Hoặc bạn có thể có bộ lọc này ở phần cuối của bộ lọc bảo mật của bạn như thế này:

<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> 

Và để có bộ lọc, bạn có thể sử dụng này:

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

Khi tôi đang chờ câu trả lời, tôi đã đưa ra giải pháp. Tôi đã thêm bộ lọc của mình (mở rộng 'GenericFilterBean') vào cuối bộ lọc bảo mật của mình. Nó hoạt động tốt. Nhưng bây giờ, như tôi đã thấy câu trả lời của bạn, nó có vẻ tốt hơn với tôi. Tôi đang thử giải pháp của bạn. Hy vọng nó hoạt động quá. Tôi sẽ cho bạn biết kết quả. Cảm ơn. –

+0

Nói chung câu trả lời của bạn là chính xác, nhưng tôi phải sửa đổi nó một chút. Cảm ơn bạn đã giúp đỡ. –

+0

Ok. Sửa đổi unswer của tôi và tôi sẽ chấp nhận các thay đổi của bạn. Sẽ rất thú vị nếu tôi biết tôi đã sai ở đâu. – dimas

13

Chỉ cần ném cái này vào hỗn hợp; cách sử dụng custom-filter bên trong http yếu tố:

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

Đây là giải pháp tốt nhất. Tôi muốn chạy bộ lọc của riêng mình trước mọi thứ khác:

Các vấn đề liên quan