web-dev-qa-db-fra.com

Comment écrire un filtre personnalisé dans la sécurité de printemps?

Je souhaite recevoir des informations par requête, je pense donc qu’au lieu d’avoir une fonction pour chaque requête et d’obtenir ces informations séparément, il vaut mieux avoir un filtre.
Ainsi, chaque demande doit passer ce filtre et je gagne ce que je veux.


La question est: comment puis-je écrire un filtre personnalisé?
Supposons qu'il ne ressemble à aucun filtre de sécurité à ressort prédéfini et qu'il soit totalement nouveau.

47
Matin Kh

Vous pouvez utiliser le filtre standard Java. Il suffit de le placer après le filtre d'authentification dans le fichier web.xml (cela signifie qu'il sera inséré plus tard dans la chaîne de filtres et appelé après la chaîne de filtres de sécurité).

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

Vous pouvez également ajouter un gestionnaire qui sera appelé après une connexion réussie (vous devez étendre SavedRequestAwareAuthenticationSuccessHandler ). Regardez ici comment faire cela. Et je pense que cette idée est encore meilleure.


MIS À JOUR:
Ou vous pouvez avoir ce filtre à la fin de vos filtres de sécurité comme ceci:

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

Et pour avoir votre filtre, vous pouvez utiliser ceci:

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
}
46
dimas

Je viens de jeter ceci dans le mélange; que diriez-vous d'utiliser custom-filter à l'intérieur de http élément:

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