In Spring Security è possibile personalizzare la procedura utilizzata per la fase di login.

Ridefinendo il filtro FORM_LOGIN_FILTER è possibile ridefinire il comportamento che terrà spring security per esempio nel caso in cui il login sia stato eseguito con successo oppure sia fallito.

All’interno del file applicationContext-security.xml

<!– HTTP security configurations –>
<http auto-config=”false” use-expressions=”true” entry-point-ref=”loginUrlAuthenticationEntryPoint”>

<custom-filter position=”FORM_LOGIN_FILTER” ref=”customUsernamePasswordAuthenticationFilter”  />
<!– Configure these elements to secure URIs in your application –>
<intercept-url pattern=”/choice/**” access=”hasRole(‘Admin’)”/>
<intercept-url pattern=”/member/**” access=”isAuthenticated()” />
<intercept-url pattern=”/resources/**” access=”permitAll” />
<intercept-url pattern=”/static/**” access=”permitAll” />
<intercept-url pattern=”/login/**” access=”permitAll” />
<intercept-url pattern=”/**” access=”isAuthenticated()” />
<logout logout-url=”/static/j_spring_security_logout” invalidate-session=”true” logout-success-url=”/index” />
</http>

<beans:bean id=”customUsernamePasswordAuthenticationFilter” class=”com.gruppomcr.xxx.service.CustomAuthenticationProcessingFilter” >
<beans:property name=”authenticationManager” ref=”authenticationManager” />
<beans:property name=”authenticationFailureHandler” ref=”failureHandler” />
<beans:property name=”authenticationSuccessHandler” ref=”successHandler” />
<beans:property name=”filterProcessesUrl” value=”/static/j_spring_security_check” />
<beans:property name=”allowSessionCreation” value=”true” />
</beans:bean>

La relativa classe CustomAuthenticationProcessingFilter permette di redefinire ad esempio:

  • Il comportamento nel caso in cui l’autenticazione sia andata a buon fine
  • Il comportamento nel caso in cui l’autenticazione sia fallita
  • il contenuto restituito dal metodo getDetails() all’interno del SecurityContext

public class CustomAuthenticationProcessingFilter extends UsernamePasswordAuthenticationFilter{

private UtenteSessionService utenteSessionService;

@Autowired

public void setUtenteService(UtenteSessionService utenteSessionService){

this.utenteSessionService = utenteSessionService;

}

@Override
// successfulAuthentication: E’ possibile definire le operazioni da effettuare subito dopo che l’autenticazione ha avuto successo
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, Authentication authResult)

throws IOException, ServletException {

super.successfulAuthentication(request, response, authResult);

String password = request.getParameter(“j_password”);

String utenza = request.getParameter(“j_username”);

System.out.println(“==successful login== pass=== “+password+” utenza=== “+utenza);

SecurityContext securityContext = SecurityContextHolder.getContext();

System.out.println(“securityContext.getAuthentication().getAuthorities():     “+securityContext.getAuthentication().getAuthorities().toString());

System.out.println(“securityContext.getAuthentication().getPrincipal():     “+securityContext.getAuthentication().getPrincipal().toString());

System.out.println(“securityContext.getAuthentication().getDetails():     “+securityContext.getAuthentication().getDetails().toString());

System.out.println(“successfulAuthentication — STO PER CHIAMARE L’INIZIALIZZAZIONE”);

}

@Override

protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) throws IOException, ServletException {

super.unsuccessfulAuthentication(request, response, failed);

System.out.println(“==failed login==”);

}

@Override

protected void setDetails(HttpServletRequest request, UsernamePasswordAuthenticationToken authRequest) {

System.out.println(“Sto chiamando set details”);

super.setDetails(request, authRequest);

Map<String, String > m = new HashMap<String, String>();

m.add(“info1″,”valore1”);

m.add(“info2″,”valore2”);

authRequest.setDetails(m);

}

}

All’interno del metodo successfulAuthentication è presente la stringa SecurityContext securityContext = SecurityContextHolder.getContext(); e la successiva stringa  securityContext.getAuthentication() che permette di reperire il corrente l’oggetto principal autenticato. Grazie a questa classe statica è possibile richiamare:

  • getAuthorities() : che restituisce la lista dei ruoli associati all’user di spring security;
  • getPrincipal() : restituisce l’oggetto UserDetails presente in sessione;
  • getDetails() : restituisce l’oggetto Details che di default ha le info sull’ip e il webservice.

La classe statica SecurityContextHolder è possibile richiamarla nel seguente modo ad esempio:
SecurityContextHolder.getContext().getAuthentication().getPrincipal(), tranquillamente all’interno dell’ambiente spring.

Sempre all’interno della classe è stato ridefinito il metodo setDetails() che permette di ridefinire le informazioni che vengono reperite da getDetails() detto precedentemente, nel nostro esempio è stato salvato una mappa con dei valori personali.

Qui è presente un link per maggiori chiarimenti:

http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html

Annunci