Cómo escribir un filtro personalizado en spring security?
Quiero recibir cierta información por solicitud, así 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.
Así que cada petición pasará ese filtro y yo ganaré lo que quiero.
La pregunta es: ¿Cómo puedo escribir un filtro personalizado?
Supongamos que no es como cualquier filtro de seguridad de resorte predefinido y es totalmente nuevo.
2 answers
Puede utilizar el filtro Java estándar. Simplemente colóquelo después del filtro de autenticación en la 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 puede agregar un controlador que se invocará después de iniciar sesión con éxito (necesita extender SavedRequestAwareAuthenticationSuccessHandler). Mira aquí cómo hacer esto. Y creo que esto es aún mejor idea.
ACTUALIZADO:
O puede tener este filtro al final de sus filtros de seguridad como este:
<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 para tener tu filtro, puedes usar esto:
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
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-05 08:24:36
Simplemente lanzando esto en la mezcla; ¿qué tal usar custom-filter
dentro del elemento http
:
<security:http auto-config="false" ...>
...
<security:custom-filter position="FORM_LOGIN_FILTER" ref="MyCustomFilter" />
</security:http>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-05 17:33:49