2013-02-24 24 views
10

Sono nuovo al framework primavera. Sto creando una pagina di accesso per la mia webapp e voglio che l'utente effettui il login prima di qualsiasi azione sull'app. Se l'utente inserisce buone credenziali tutto va bene e funziona, ma se entra male, voglio visualizzare un messaggio e mantenere il nome utente sull'elemento di input. La visualizzazione di un messaggio non è un problema, ma non sono in grado di mantenere il nome utente nel mio file jps senza utilizzare la variabile deprecata SPRING_SECURITY_LAST_USERNAME.Autenticazione di sicurezza Spring: ottieni il nome utente senza SPRING_SECURITY_LAST_USERNAME

La speranza che qualcuno mi può aiutare, sto usando Primavera 3.

UPDATE: i requisiti dice che non voglio per visualizzare il nome utente l'url.

risposta

22

La documentazione della costante deprecato dice esattamente cosa si dovrebbe fare:

/** 
* @deprecated If you want to retain the username, cache it in a customized {@code AuthenticationFailureHandler} 
*/ 
@Deprecated 
public static final String SPRING_SECURITY_LAST_USERNAME_KEY = 
      "SPRING_SECURITY_LAST_USERNAME"; 

Qualcosa di simile a questo:

public class UserNameCachingAuthenticationFailureHandler 
    extends SimpleUrlAuthenticationFailureHandler { 

    public static final String LAST_USERNAME_KEY = "LAST_USERNAME"; 

    @Autowired 
    private UsernamePasswordAuthenticationFilter usernamePasswordAuthenticationFilter; 

    @Override 
    public void onAuthenticationFailure(
      HttpServletRequest request, HttpServletResponse response, 
      AuthenticationException exception) 
      throws IOException, ServletException { 

     super.onAuthenticationFailure(request, response, exception); 

     String usernameParameter = 
      usernamePasswordAuthenticationFilter.getUsernameParameter(); 
     String lastUserName = request.getParameter(usernameParameter); 

     HttpSession session = request.getSession(false); 
     if (session != null || isAllowSessionCreation()) { 
      request.getSession().setAttribute(LAST_USERNAME_KEY, lastUserName); 
     } 
    } 
} 

nella configurazione di sicurezza:

<security:http ...> 
    ... 
    <security:form-login 
     authentication-failure-handler-ref="userNameCachingAuthenticationFailureHandler" 
    ... 
    /> 
</security:http> 

<bean 
    id="userNameCachingAuthenticationFailureHandler" 
    class="so.UserNameCachingAuthenticationFailureHandler"> 
    <property name="defaultFailureUrl" value="/url/to/login?error=true"/> 
</bean> 

Nella tua login .jsp:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ page session="true" %> 

... 

<%--in the login form definition--%> 
<input id="j_username" name="j_username" type="text" 
    value="<c:out value="${sessionScope.LAST_USERNAME}"/>"/> 
+0

Grazie mille! Funziona come necessario! – droidpl

+1

Nessun problema. Nota che ci sono margini di miglioramento in alcuni punti. Per esempio. hard-coding il nome dell'attributo di sessione in .jsp non è elegante. Idealmente dovrebbe fare riferimento alla costante definita in 'UserNameCachingAuthenticationFailureHandler'. (Devo ammettere che non so come ottenere questa indiretta.) – zagyi

+0

Non sapevo che si potesse ottenere! Ma per ora è tutto ciò di cui ho bisogno, questa non è una sicurezza adeguata, ma un piccolo trucco per migliorare la vita dell'utente! È incredibile che non trovassi un'altra soluzione semplice come questa ovunque! ;) – droidpl

4

Se qualcuno viene qui che sta avendo questo problema in Grails Spring security. È ora possibile utilizzare la seguenti-

import grails.plugin.springsecurity.SpringSecurityUtils; 

Ora usano SpringSecurityUtils.SPRING_SECURITY_LAST_USERNAME_KEY questo lavoro e non è deprecato.

Problemi correlati