Hinzufügen eines benutzerdefinierten Filters nach der Autorisierung durch den Benutzer im Frühjahr

Ich bin ein Neuling in Spring Security 3. Ich benutze Rollen für Benutzer, um sich anzumelden.

Ich möchte einen Sitzungswert hinzufügen, nachdem ein Benutzer zur Anwendung autorisiert wurde. Möglicherweise benötige ich einen Filter, damit er zu meiner Methode umleitet, die einen gewissen Sitzungswert hinzufügt. Ich habe meine security.xml-Datei konfiguriert, bin mir aber nicht sicher, ob ich die richtigen Dinge tue. Alle Beispiele in dieser Richtung würden helfen. Welche Filterklasse soll ich verwenden? Wie soll ich die Datei security.xml konfigurieren?

<custom-filter ref="authenticationFilter" after="FORM_LOGIN_FILTER "/>

<beans:bean id="authenticationFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
    <beans:property name="filterProcessesUrl" value="/j_spring_security_check" />
    <beans:property name="authenticationManager" ref="authenticationManager" />
    <beans:property name="authenticationSuccessHandler" ref="successHandler" />
</beans:bean> 

<beans:bean id="successHandler" class="org.dfci.sparks.datarequest.security.CustomAuthorizationFilter"/>

Meine Filterklassenmethode Ich muss einen Sitzungswert hinzufügen.

public class CustomAuthorizationFilter implements AuthenticationSuccessHandler {

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request,
            HttpServletResponse response, Authentication authentication)
            throws IOException, ServletException {
        Set<String> roles = AuthorityUtils.authorityListToSet(authentication
                .getAuthorities());
        if (roles.contains("ROLE_USER")) {
            request.getSession().setAttribute("myVale", "myvalue");
        }
    }
}

Code bearbeiten

Ich habe die Datei security.xml und die Klassendatei geändert

<custom-filter ref="authenticationFilter" after="FORM_LOGIN_FILTER "/>  
public class CustomAuthorizationFilter extends GenericFilterBean {

    /*
     * ServletRequestAttributes attr = (ServletRequestAttributes)
     * RequestContextHolder.currentRequestAttributes(); HttpSession
     * session=attr.getRequest().getSession(true);
     */
    @Autowired
    private UserService userService;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        try {
            chain.doFilter(request, response);

                    HttpServletRequest req = (HttpServletRequest) request;
                    HttpSession session = req.getSession(true);
                    Authentication authentication = SecurityContextHolder
                            .getContext().getAuthentication();
                    Set<String> roles = AuthorityUtils
                            .authorityListToSet(authentication.getAuthorities());
                    User user = null;                   
                        if (true) {
                            session.setAttribute("Flag", "Y");
                        } 
            }

        } catch (IOException ex) {
            throw ex;
        }
    }

}

Welches ruft jede einzelne URL auf. Ist es eine Alternative, die Filtermethode nur einmal aufzurufen, wenn ein Benutzer authentifiziert ist?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage