Получить Spring Принципа безопасности в выражении JSP EL
Я использую Spring MVC и Spring версию безопасности 3.0.6.RELEASE. Какой самый простой способ получить имя пользователя в моем JSP? Или даже просто, зарегистрирован ли пользователь? Я могу представить пару способов:
1. Использование сценария
Используя такой скриптлет, чтобы определить, зарегистрирован ли пользователь:
<%=org.springframework.security.core.context.SecurityContextHolder.getContext()
.getAuthentication().getPrincipal().equals("anonymousUser")
? "false":"true"%>
Я не поклонник использования сценариев, хотя, и я хочу использовать это в тегах <c:if>
, которые требуют вернуть его в качестве атрибута страницы.
2. Использование SecurityContextHolder
Я мог бы снова использовать SecurityContextHolder из моего @Controller
и поместить его в модель. Мне нужно это на каждой странице, поэтому мне не нужно добавлять эту логику в каждый из моих контроллеров.
Я подозреваю, что есть более чистый способ сделать это...
Ответы
Ответ 1
Проверьте теги безопасности 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
Ответ 2
Я знаю, что в потоке есть другие ответы, но никто не ответил, как вы можете проверить, аутентифицирован ли пользователь. Поэтому я делюсь тем, что нравится моему коду.
Включите тег lib в свой проект:
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
Затем создайте объект пользователя в текущей области, добавив:
<sec:authentication var="user" property="principal" />
Затем вы можете легко показать имя пользователя, добавив. Помните, что основной объект обычно имеет строку типа, если вы не внедрили защиту spring, чтобы изменить ее на другой класс в вашем проекте:
<sec:authorize access="hasRole('ROLE_USER') and isAuthenticated()">
${user}
</sec:authorize>
Надеюсь, это поможет кому-то посмотреть на роли пользователя.
Если вы используете Maven, добавьте тег зависимостей, как упомянуто Кристианом Вилмемой в этом потоке.
Спасибо!
Ответ 3
Вы можете использовать следующее:
Spring Защитный тег Lib - 3.1.3.RELEASE
<sec:authentication var="principal" property="principal" />
а затем:
${principal.username}
Ответ 4
Я использовал 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
, не уверен).
Ответ 5
Я согласен с alephx, я даже проголосовал за его ответ.
Но если вам нужен другой подход, вы можете использовать тот, который использует Spring Roo.
Если у вас есть SecurityContextHolderAwareRequestFilter, он предоставляет стандартные методы защиты сервлета API, используя оболочку запроса, которая обращается к SecurityContext.
Этот фильтр зарегистрирован тегом <http>
из пространства имен Spring Security. Вы также можете зарегистрировать его в цепочке фильтров фильтра FilterChainProxy (просто добавьте ссылку на объявленный bean в ваш applicationContext-security.xml)
Затем вы можете получить доступ к API сервлетов безопасности, как это делает Roo (найдите footer.jspx, чтобы увидеть, как написана условная запись выхода)
<c:if test="${pageContext['request'].userPrincipal != null}">
<c:out value=" | "/>
...
Ответ 6
Это работает независимо от того, вошел ли пользователь в систему или нет, и работает при использовании анонимной аутентификации:
<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
Я думаю, что <sec:authentication property="principal.username" />
не всегда будет работать, потому что тип, возвращаемый Authentication.getPrincipal()
, является Object, то есть: он может быть UserDetail (для чего будет работать выше), String или что-то еще.
Для отображения имени пользователя на странице JSP, что я считаю более надежным, используйте ${pageContext.request.userPrincipal.name}
.
Используется java.security.Principal.getName()
, который возвращает String.
Ответ 8
Насколько я знаю по умолчанию Spring Безопасность 3.0.x устанавливает a SecurityContextHolderRquestAwareFilter
, чтобы вы могли получить объект Authentication
, вызвав HttpServletRequest.getUserPrincipal()
, а также вы можете запросить роли, вызвав HttpServletRequest.isUserInRole()
.
Ответ 9
1) MY CUSTOM USER CLASS с дополнительным полем мобильного телефона:
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) В MY UserDetailsServiceImpl.java
Я ПОПУЛЯЛ ЭТОТ КЛИЕНТСКИЙ объект 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) И В ПРОСМОТРЕ Я ЕСМЬ ДОСТУП К КАК:
< a href= "#" th: text = "$ {# httpServletRequest.userPrincipal.principal.mobile}" >