2012-01-28 16 views
39

Estoy usando Spring MVC y Spring Security versión 3.0.6.RELEASE. ¿Cuál es la forma más fácil de obtener el nombre de usuario en mi JSP? ¿O incluso si el usuario ha iniciado sesión o no? No puedo pensar en un par de maneras:Obtener Spring Security Principal en expresión JSP EL

1. El uso de un scriptlet

El uso de un scriptlet como este para determinar si el usuario se registra en:

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

No soy un fan de la utilización scriptlets, sin embargo, y quiero usar esto en algunas etiquetas <c:if>, que requieren volver a colocarlo como un atributo de página.

2. Usando SecurityContextHolder

pude volver a utilizar SecurityContextHolder de mi @Controller y lo puso en el modelo. Necesito esto en cada página, así que prefiero no tener que agregar esta lógica en cada uno de mis Controladores.

Sospecho que hay una forma más limpia de hacer esto ...

Respuesta

52

Verificar las etiquetas de seguridad de Primavera: <sec:authentication property="principal.username" />

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

y se puede comprobar si conectado:

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

vez de c: si

+5

¡Perfecto! Para cualquier otra persona que pueda ver esto, tuve que agregar a spring-security.xml para que funcione. –

+6

¡Genial, mucho mejor! Si alguien más tiene este problema, las etiquetas de seguridad de primavera se ignoran hasta que agregue una dependencia spring-security-taglibs en mi pom.xml. – user64141

1

Por lo que sé de forma predeterminada Spring Security 3.0.x installs a SecurityContextHolderRquestAwareFilter, para que pueda obtener el objeto Authentication llamando al HttpServletRequest.getUserPrincipal(), y también puede consultar roles llamando al HttpServletRequest.isUserInRole().

+0

Lo intenté, al menos usando la expresión '$ {request.userPrincipal}', pero vuelve nulo. Tal vez hice algo para romperlo ... ¡gracias, sin embargo! –

+0

@Jeremiah Orr es extraño, tengo varias aplicaciones que dependen de esa integración entre Spring Security y la API de Servlet. ¿Tal vez ha especificado una pila personalizada de Spring Security en lugar de usar la predeterminada? – gpeche

5

Estoy de acuerdo con alephx, incluso voté su respuesta.

Pero si necesita otro enfoque, puede usar el que utiliza Spring Roo.

Si tiene SecurityContextHolderAwareRequestFilter, proporciona los métodos de seguridad de la API de servlet estándar, utilizando un contenedor de solicitudes que accede al SecurityContext.

Este filtro está registrado con la etiqueta <http> del espacio de nombres Spring Security. También puede registrarlo en la cadena de filtros de seguridad de FilterChainProxy (simplemente agregue la referencia a un bean declarado en su applicationContext-security.xml)

Luego, puede acceder a la API de servlet de seguridad como lo hace Roo (busque footer.jspx para ver cómo se escribe un enlace de desconexión condicional)

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

9

que estaba usando Maven por lo que tuvieron que añadir la biblioteca taglibs sumando esto a la pom.xml

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

Luego, en mi JSP ha añadido:

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

Y:

<sec:authentication property="principal" /> 

principal.username mantuvo produce errores (tal vez es la manera que crea el objeto UsernamePasswordAuthenticationToken, no estoy seguro).

10

Se puede utilizar la siguiente manera: primavera etiqueta de seguridad Lib - 3.1.3.RELEASE

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

y luego:

${principal.username} 
16

Sé que hay otras respuestas en el hilo, pero ninguno he respondido cómo puede verificar si el usuario está autenticado. Así que estoy compartiendo lo que mi código parece.

Incluir la lib etiqueta en su proyecto:

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

A continuación, cree un objeto de usuario en el ámbito actual añadiendo:

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

Entonces usted puede mostrar fácilmente el nombre de usuario añadiendo. Recuerde que el 'principal' objeto es generalmente de tipo cadena, a menos que haya implementado la seguridad de primavera en una manera de cambiar a otra clase en su proyecto:

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

espero que esto ayude a alguien mirando para comprobar las funciones de usuario.

Si está utilizando Maven, agregue la etiqueta de dependencia mencionada por Christian Vielma en este hilo.

Gracias!

4

creo <sec:authentication property="principal.username" /> no siempre funciona porque el tipo devuelto por Authentication.getPrincipal() es objeto, es decir: que podría ser una UserDetail (para los que lo anterior va a funcionar), una cadena o cualquier otra cosa.

Para el propósito de mostrar el nombre de usuario en la página JSP lo que encuentro más confiable es usar ${pageContext.request.userPrincipal.name}.

Esto usa java.security.Principal.getName() que devuelve String.

+0

Esto no parece funcionar cuando se utiliza autenticación anónima –

5

Esto funciona si el usuario está conectado o no, y funciona cuando se utiliza autenticación anónima:

<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> 

tarde ...

Hello ${username} 
0

1) MI CLASE usuario personalizada con el móvil campo extra :

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) EN MI UserDetailsServiceImpl.java POBLOTE ESTE objeto CUSTOM SiteUser.

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) y en vista accedo COMO:

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

Cuestiones relacionadas