2012-08-13 18 views
41

Deseo recibir información por solicitud, por lo que creo que en lugar de tener una función para cada solicitud y obtener esa información de las solicitudes por separado, es mejor tener un filtro.
Entonces cada solicitud pasará ese filtro y yo obtendré lo que quiero.


La pregunta es: ¿cómo puedo escribir un filtro personalizado?
Supongamos que no es como cualquier filtro de seguridad de primavera predefinido y es totalmente nuevo.¿Cómo escribir un filtro personalizado en la seguridad de primavera?

Respuesta

42

Puede usar el filtro estándar de Java. Simplemente colóquelo después del filtro de autenticación en web.xml (esto significa que irá más adelante en la cadena de filtros y se llamará después de la cadena de filtros de seguridad).

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 
    } 

} 

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

también usted puede añadir manejador que se invocará Tras haberse identificado correctamente (lo que necesita para extender SavedRequestAwareAuthenticationSuccessHandler). Look here cómo hacer esto. Y creo que esta es una idea aún mejor.


ACTUALIZADO:
o puede hacer que este filtro al final de sus filtros de seguridad así:

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

Y tener su filtro, es posible utilizar este:

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

Mientras esperaba la respuesta, se me ocurrió una solución. Agregué mi filtro ('GenericFilterBean' extendido) al final de mis filtros de seguridad. Está funcionando bien. Pero ahora, cuando vi tu respuesta, me parece mejor. Estoy probando tu solución. Espero que también funcione Te dejaré saber el resultado. Gracias. –

+0

Generalmente tu respuesta es correcta, pero tengo que modificarla un poco. Gracias por tu ayuda. –

+0

Ok. Modifique mi respuesta y aceptaré sus cambios. Me resultará interesante saber dónde me equivoqué. – dimas

13

Sólo arrojando esto en la mezcla; ¿Y si uso custom-filter dentro http elemento:

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

Esta es de lejos la mejor solución. Quería ejecutar mi propio filtro antes que todo:

Cuestiones relacionadas