我正在使用Spring MVC和Spring Security 3.0.6.RELEASE。在JSP中获取用户名的最简单方法是什么?或者甚至只是用户是否登录?我可以想到几个方面:
使用这样的scriptlet来确定用户是否已登录:
<%=org.springframework.security.core.context.SecurityContextHolder.getContext()
.getAuthentication().getPrincipal().equals("anonymousUser")
? "false":"true"%>
我不喜欢使用scriptlet,我想在一些<c:if>
标签中使用它,这需要将其作为页面属性放回。
我可以再次使用我的@Controller
中的SecurityContextHolder并将其放在模型上。不过,我在每个页面上都需要这个,所以我宁愿不必在每个控制器中添加这个逻辑。
我怀疑有更简洁的方法来做到这一点......
答案 0 :(得分:55)
检查Spring安全标记:<sec:authentication property="principal.username" />
http://static.springsource.org/spring-security/site/docs/3.0.x/reference/taglibs.html
您可以检查是否记录:
<sec:authorize access="isAuthenticated()">
而不是c:if
答案 1 :(得分:17)
我知道该帖子中还有其他答案,但没有人回答您如何检查用户是否经过身份验证。所以我正在分享我的代码看起来像什么。
在项目中包含标记lib:
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
然后通过添加:
在当前范围内创建用户对象<sec:authentication var="user" property="principal" />
然后您可以通过添加轻松显示用户名。请记住,'principal'对象通常是string类型,除非您已经实现了spring security以将其更改为项目中的另一个类:
<sec:authorize access="hasRole('ROLE_USER') and isAuthenticated()">
${user}
</sec:authorize>
我希望这可以帮助有人检查用户角色。
如果你正在使用Maven,那么在这个帖子中添加Christian Vielma所提到的依赖标记。
谢谢!
答案 2 :(得分:11)
您可以这样使用: Spring Security Tag Lib - 3.1.3.RELEASE
<sec:authentication var="principal" property="principal" />
然后:
${principal.username}
答案 3 :(得分:9)
我正在使用Maven,所以我必须添加taglibs库,将其添加到pom.xml
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>3.1.3.RELEASE</version>
</dependency>
然后在我的jsp中添加:
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
和
<sec:authentication property="principal" />
principal.username
一直给我错误(也许是我创建UsernamePasswordAuthenticationToken
对象的方式,不确定)。
答案 4 :(得分:5)
我同意 alephx ,我甚至投了他的答案。
但是如果你需要另一种方法,你可以使用Spring Roo使用的方法。
如果你有SecurityContextHolderAwareRequestFilter,它使用访问SecurityContext的请求包装器提供标准的servlet API安全方法。
此过滤器使用Spring Security命名空间中的<http>
标记进行注册。您也可以在FilterChainProxy的安全过滤器链中注册它(只需在applicationContext-security.xml中添加对已声明bean的引用)
然后,您可以像Roo一样访问安全servlet API(找到footer.jspx以查看如何编写条件注销链接)
<c:if test="${pageContext['request'].userPrincipal != null}">
<c:out value=" | "/>
...
答案 5 :(得分:5)
我认为<sec:authentication property="principal.username" />
并不总是有效,因为Authentication.getPrincipal()
返回的类型是Object,即:它可能是UserDetail(上面可以使用),字符串或任何东西其他
为了在JSP页面中显示用户名,我发现更可靠的是使用${pageContext.request.userPrincipal.name}
。
这使用返回String的java.security.Principal.getName()
。
答案 6 :(得分:5)
无论用户是否登录,这都有效,并且在使用匿名身份验证时可以正常工作:
<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>
...后来
Hello ${username}
答案 7 :(得分:2)
j标记是:
<%@taglib prefix="j" uri="http://java.sun.com/jsp/jstl/core" %>
sec标签是:
<%@taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
添加到pom.xml:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>3.1.3.RELEASE</version>
</dependency>
添加到页面:
<sec:authentication var="principal" property="principal"/>
<j:choose>
<j:when test="${principal eq 'anonymousUser'}">
NOT AUTHENTICATED
</j:when>
<j:otherwise>
AUTHENTICATED
</j:otherwise>
</j:choose>
答案 8 :(得分:1)
据我所知,默认Spring Security 3.0.x installs和SecurityContextHolderRquestAwareFilter
,以便您可以通过调用Authentication
获取HttpServletRequest.getUserPrincipal()
对象,还可以通过调用查询角色HttpServletRequest.isUserInRole()
。
答案 9 :(得分:1)
要访问主体属性,首先,为属性创建一个变量:
<sec:authentication property="principal.attributes" var="principalAttr"/>
然后,您可以使用此映射通过属性键名称检索值:
${principalAttr.get("given_name")}
不要忘记在您的maven依赖项列表中添加spring security taglib:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>5.3.4.RELEASE</version>
</dependency>
答案 10 :(得分:0)
1)我的自定义用户类与额外的现场手机:
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)在我的UserDetailsServiceImpl.java中 我已经对这个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)以及我在以下方式访问:
&LT; a href =&#34;#&#34;个:文本=&#34; $ {#} httpServletRequest.userPrincipal.principal.mobile&#34;&GT;