I am using Spring MVC and Spring Security version 3.0.6.RELEASE. What is the easiest way to get the user name in my JSP? Or even just whether or not the user is logged in? I can think of a couple ways:
1. Using a scriptlet
Using a scriptlet like this to determine if the user is logged in:
<%=org.springframework.security.core.context.SecurityContextHolder.getContext()
.getAuthentication().getPrincipal().equals("anonymousUser")
? "false":"true"%>
I'm not a fan of using scriptlets, though, and I want to use this in some <c:if>
tags, which requires putting it back as a page attribute.
2. Using SecurityContextHolder
I could again use SecurityContextHolder from my @Controller
and put it on the model. I need this on every page, though, so I'd rather not have to add this logic in every one of my Controllers.
I suspect there's a cleaner way to do this...
I was using Maven so I had to add the taglibs library adding this to the pom.xml
Then in my jsp added:
And:
principal.username
kept giving me errors (maybe is the way I created theUsernamePasswordAuthenticationToken
object, not sure).1) MY CUSTOM USER CLASS with extra field mobile:
2) IN MY UserDetailsServiceImpl.java I POPULATED THIS CUSTOM SiteUser object.
3) AND IN VIEW I AM ACCESSING IT AS:
< a href="#" th:text="${#httpServletRequest.userPrincipal.principal.mobile}">
I agree with alephx, I even voted his answer.
But if you need another approach, you could use the one that Spring Roo uses.
If you have the SecurityContextHolderAwareRequestFilter, it provides the standard servlet API security methods, using a request wrapper which accesses the SecurityContext.
This filter is registered with the
<http>
tag from the Spring Security namespace. You can also register it in the FilterChainProxy's security filter chain (just add the reference to a declared bean in your applicationContext-security.xml)Then, you can access the security servlet API as Roo does (find the footer.jspx to see how a conditional logout link is written)
j tag is:
sec tag is:
Add to pom.xml:
Add to the page: