2012-08-13 12 views
41

मैं प्रति अनुरोध कुछ जानकारी प्राप्त करना चाहता हूं, इसलिए मुझे लगता है कि प्रत्येक अनुरोध के लिए एक कार्य करने और अलग-अलग अनुरोधों से उन जानकारी प्राप्त करने के बजाय, फ़िल्टर होना बेहतर है।
तो हर अनुरोध उस फ़िल्टर को पास करेगा और मैं जो चाहता हूं उसे हासिल करूंगा।


सवाल यह है: मैं एक कस्टम फ़िल्टर कैसे लिख सकता हूं?
मान लीजिए कि यह किसी पूर्वनिर्धारित वसंत सुरक्षा फ़िल्टर की तरह नहीं है और यह बिल्कुल नया है।वसंत सुरक्षा में एक कस्टम फ़िल्टर कैसे लिखें?

उत्तर

42

आप मानक जावा फ़िल्टर का उपयोग कर सकते हैं। वेब.एक्सएमएल में प्रमाणीकरण फ़िल्टर के बाद बस इसे रखें (इसका मतलब है कि यह बाद में फिल्टर श्रृंखला में जाएगा और सुरक्षा फ़िल्टर श्रृंखला के बाद बुलाया जाएगा)।

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 
    } 

} 

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> 

इसके अलावा, आप हैंडलर जोड़ सकते हैं कि सफल प्रवेश के बाद लागू किया जाएगा (आप SavedRequestAwareAuthenticationSuccessHandler बढ़ाने की जरूरत)। Look here यह कैसे करें। और मुझे लगता है कि यह भी बेहतर विचार है।


UPDATED:
या आप इस तरह से अपनी सुरक्षा फिल्टर के अंत में इस फिल्टर हो सकता है:

<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

मैं जवाब के लिए इंतजार कर रहा था के रूप में, मैं एक समाधान के साथ आया था। मैंने अपने सुरक्षा फ़िल्टर के अंत में अपना फ़िल्टर (विस्तारित 'जेनेरिकफिल्टर बीन') जोड़ा। यह ठीक काम कर रहा है। लेकिन अब, जैसा कि मैंने आपका जवाब देखा, यह मेरे लिए बेहतर लगता है। मैं आपके समाधान का प्रयास कर रहा हूं। उम्मीद है कि यह भी काम करता है। मैं आपको परिणाम बता दूंगा। धन्यवाद। –

+0

आम तौर पर आपका उत्तर सही है, लेकिन मुझे इसे थोड़ा संशोधित करना है। आपकी सहायता के लिए धन्यवाद. –

+0

ठीक है। मेरे unswer संशोधित करें और मैं आपके परिवर्तन स्वीकार करेंगे। मेरे लिए यह जानना दिलचस्प होगा कि मैं कहां गलत था। – dimas

13

बस मिश्रण में फेंकना; कैसे http तत्व के अंदर custom-filter उपयोग के बारे में:

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

यह अब तक का सबसे अच्छा समाधान है। मैं सब कुछ से पहले अपना खुद का फ़िल्टर चलाने के लिए चाहता था: <कस्टम-फिल्टर रेफरी = "myCustomFilter" = "FIRST" /> से पहले –

संबंधित मुद्दे