Sono un novizio di Spring Security 3. Uso i ruoli per gli utenti per l'accesso.Come aggiungere un filtro personalizzato dopo che l'utente ha autorizzato l'applicazione in primavera
Desidero aggiungere un valore di sessione dopo che un utente è autorizzato nell'applicazione. Forse ho bisogno di un filtro per reindirizzare al mio metodo che aggiunge qualche valore di sessione. Ho configurato il mio file security.xml ma non sono sicuro di fare le cose giuste. Qualsiasi esempio in quella direzione sarebbe d'aiuto. Quale classe filtro dovrei usare? Come dovrei configurare il file security.xml?
<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"/>
Il mio metodo di classe filtro Ho bisogno di aggiungere qualche valore di sessione.
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");
}
}
}
Modifica codice
Ho modificato il mio file security.xml e file di classe
<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;
}
}
}
che richiama ogni URL. C'è qualche alternativa a chiamare il metodo di filtraggio solo una volta quando un utente è autenticato?
Qual è il problema con il codice sopra? Non ricevi l'attributo myValue di sessione all'interno dell'url di login? –
@SunilChavan: chiama questo filtro prima che l'utente sia autenticato. – Raje
Come puoi dire questo? Consulta i dettagli (API) [http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/authentication/AuthenticationSuccessHandler.html]. Dice chiaramente dopo l'autenticazione di successo chiama su metodo Autenticazione Successo –