2012-01-28 17 views
39

Sto utilizzando Spring MVC e Spring Security versione 3.0.6.RELEASE. Qual è il modo più semplice per ottenere il nome utente nel mio JSP? O anche solo se l'utente ha effettuato l'accesso o meno? Mi vengono in mente un paio di modi:Ottenere il preside di sicurezza Spring nell'espressione JSP EL

1. Utilizzando uno scriptlet

Utilizzando uno scriptlet come questo per determinare se l'utente è connesso:

<%=org.springframework.security.core.context.SecurityContextHolder.getContext() 
    .getAuthentication().getPrincipal().equals("anonymousUser") 
    ? "false":"true"%> 

Io non sono un fan di utilizzare scriptlet, però, e voglio usarlo in alcuni tag <c:if>, che richiede di rimetterlo come attributo di pagina.

2. Utilizzando SecurityContextHolder

ho potuto ancora utilizzare SecurityContextHolder dal mio @Controller e metterlo sul modello. Ho bisogno di questo su ogni pagina, quindi, preferirei non dover aggiungere questa logica in ognuno dei miei controller.

Ho il sospetto che ci sia un modo più pulito per fare questo ...

risposta

52

Controlla etichette di sicurezza Primavera: <sec:authentication property="principal.username" />

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

e si può controllare se il login:

<sec:authorize access="isAuthenticated()"> 

invece di c: se

+5

Perfetto! Per chiunque altro possa vederlo, ho dovuto aggiungere a spring-security.xml per farlo funzionare. –

+6

Ottimo, molto meglio! Se qualcun altro ha questo problema, i miei tag di sicurezza primaverili sono stati ignorati fino a quando non ho aggiunto una dipendenza da tagli di sicurezza a molla nel mio pom.xml. – user64141

1

Per quanto ne so, per impostazione predefinita Spring Security 3.0.x installs a SecurityContextHolderRquestAwareFilter, in modo da poter ottenere l'oggetto Authentication chiamando HttpServletRequest.getUserPrincipal() ed è anche possibile eseguire query sui ruoli chiamando HttpServletRequest.isUserInRole().

+0

L'ho provato, almeno usando l'espressione '$ {request.userPrincipal}', ma torna nullo. Forse ho fatto qualcosa per romperlo ... grazie, però! –

+0

@Jeremiah Orr è strano, ho diverse applicazioni basate su quell'integrazione tra Spring Security e l'API Servlet. Forse hai specificato uno stack Spring Security personalizzato invece di usare quello predefinito? – gpeche

5

Sono d'accordo con alephx, ho persino votato la sua risposta.

Ma se è necessario un altro approccio, è possibile utilizzare quello che Spring Roo utilizza.

Se si dispone di SecurityContextHolderAwareRequestFilter, fornisce i metodi di sicurezza dell'API della servlet standard, utilizzando un wrapper di richiesta che accede a SecurityContext.

Questo filtro è registrato con il tag <http> dallo spazio dei nomi Spring Security. Puoi anche registrarlo nella catena del filtro di sicurezza FilterChainProxy (aggiungi il riferimento a un bean dichiarato nella tua applicazioneContext-security.xml)

Quindi, puoi accedere all'API del servlet di sicurezza come fa Roo (trova il footer.jspx per vedere come un link per uscire condizionale è scritto)

<c:if test="${pageContext['request'].userPrincipal != null}"> 
<c:out value=" | "/> 
... 

9

stavo usando Maven quindi ho dovuto aggiungere la libreria taglibs aggiungendo questo al pom.xml

<dependency> 
    <groupId>org.springframework.security</groupId> 
    <artifactId>spring-security-taglibs</artifactId> 
    <version>3.1.3.RELEASE</version> 
</dependency> 

Poi nel mio jsp aggiunto:

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> 

E:

<sec:authentication property="principal" /> 

principal.username tenuto mi dà errori (forse è il modo in cui ho creato l'oggetto UsernamePasswordAuthenticationToken, non è sicuro).

10

È possibile utilizzare in questo modo: Primavera di sicurezza Tag Lib - 3.1.3.RELEASE

<sec:authentication var="principal" property="principal" /> 

e poi:

${principal.username} 
16

So che ci sono altre risposte nel thread, ma nessuno ho risposto come puoi verificare se l'utente è autenticato. Quindi sto condividendo ciò che piace al mio codice.

Includere il lib tag nel progetto:

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> 

quindi creare un oggetto utente nel campo di applicazione attuale con l'aggiunta di:

<sec:authentication var="user" property="principal" /> 

Poi si può mostrare facilmente il nome utente con l'aggiunta. Ricordate l'oggetto 'principale' è in genere di tipo stringa a meno che non si è implementato la sicurezza primavera in un modo per cambiare ad un altro di classe nel progetto:

<sec:authorize access="hasRole('ROLE_USER') and isAuthenticated()"> 
${user} 
</sec:authorize> 

Spero che questo aiuta qualcuno alla ricerca di controllare ruoli utente.

Se si utilizza Maven, quindi aggiungere il tag dipendenza come indicato da Christian Vielma in questo thread.

Grazie!

4

Penso che <sec:authentication property="principal.username" /> non funzioni sempre perché il tipo restituito da Authentication.getPrincipal() è Oggetto, ovvero: potrebbe essere un UserDetail (per il quale funzionerà sopra), una stringa o qualsiasi altra cosa.

Allo scopo di visualizzare il nome utente nella pagina JSP, quello che ritengo più affidabile è l'utilizzo di ${pageContext.request.userPrincipal.name}.

Questo utilizza java.security.Principal.getName() che restituisce String.

+0

Questo non sembra funzionare quando si utilizza l'autenticazione anonima –

5

questo funziona se l'utente è loggato o meno, e funziona quando si utilizza Autenticazione anonima:

<sec:authorize access="isAuthenticated()"> 
    <sec:authentication property="principal.username" var="username" /> 
</sec:authorize> 
<sec:authorize access="!isAuthenticated()"> 
    <sec:authentication property="principal" var="username" /> 
</sec:authorize> 

tardi ...

Hello ${username} 
0

1) MY CUSTOM CLASS USER con il mobile campo aggiuntivo :

public class SiteUser extends User { 

    public SiteUser(String username, String password, Collection<? extends GrantedAuthority> authorities, 
      String mobile) { 
     super(username, password, true, true, true, true, authorities); 
     this.mobile = mobile; 
    } 

    private String mobile; 

    public String getMobile() { 
     return mobile; 
    } 

    public void setMobile(String mobile) { 
     this.mobile = mobile; 
    } 

} 

2) NEL MIO UserDetailsServiceImpl.java HO POPOLATO QUESTO oggetto SiteUser CUSTOM.

public SiteUser loadUserByUsername(String username) { 
     UserInfoVO userInfoVO = userDAO.getUserInfo(username); 
     GrantedAuthority authority = new SimpleGrantedAuthority(userInfoVO.getRole()); 

     SiteUser siteUser = new SiteUser(userInfoVO.getUsername(), userInfoVO.getPassword(), 
       Arrays.asList(authority), userInfoVO.getMobile()); 

     return siteUser; 
} 

3) e in vista io sono l'accesso come:

< a href = "#" th: text = "$ {# httpServletRequest.userPrincipal.principal.mobile}">

Problemi correlati