Получить принципала безопасности Spring в выражении JSP EL - PullRequest
42 голосов
/ 29 января 2012

Я использую Spring MVC и Spring Security версии 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 и поместить его в модель. Мне нужно это на каждой странице, поэтому я бы не стал добавлять эту логику в каждый из моих контроллеров.

Я подозреваю, что есть более чистый способ сделать это ...

Ответы [ 10 ]

55 голосов
/ 29 января 2012

Проверьте теги безопасности 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: если

17 голосов
/ 03 июля 2013

Я знаю, что в этой ветке есть и другие ответы, но никто не ответил, как вы можете проверить, аутентифицирован ли пользователь.Итак, я делюсь тем, как выглядит мой код.

Включите тег lib в ваш проект:

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

Затем создайте пользовательский объект в текущей области, добавив:

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

Затем вы можете легко показать имя пользователядобавляя.Помните, что «главный» объект, как правило, имеет тип string, если вы не реализовали безопасность Spring таким образом, чтобы изменить его на другой класс в своем проекте:

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

Я надеюсь, что это поможет кому-то проверить права пользователя.

Если вы используете Maven, добавьте тег зависимости, как упомянуто Кристианом Вьельмой в этой теме.

Спасибо!

11 голосов
/ 03 июля 2013

Вы можете использовать вот так: Spring Security Tag Lib - 3.1.3.RELEASE

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

и затем:

${principal.username}
9 голосов
/ 01 мая 2013

Я использовал 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 голосов
/ 18 февраля 2015

Это работает независимо от того, вошел ли пользователь в систему или нет, и работает при использовании анонимной аутентификации:

<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}
5 голосов
/ 20 марта 2014

Я думаю, <sec:authentication property="principal.username" /> не всегда будет работать, потому что тип, возвращаемый Authentication.getPrincipal(), является Object, т.е.Строка или что-то еще.

Для отображения имени пользователя на странице JSP я считаю более надежным использование ${pageContext.request.userPrincipal.name}.

. Используется java.security.Principal.getName(), который возвращаетСтрока.

5 голосов
/ 29 января 2012

Я согласен с alephx , я даже проголосовал за его ответ.

Но если вам нужен другой подход, вы можете использовать тот, который использует Spring Roo.

Еслиу вас есть SecurityContextHolderAwareRequestFilter, он предоставляет стандартные методы безопасности API сервлетов, используя оболочку запроса, которая обращается к SecurityContext.

Этот фильтр зарегистрирован с тегом <http> из пространства имен Spring Security.Вы также можете зарегистрировать его в цепочке фильтров безопасности FilterChainProxy (просто добавьте ссылку на объявленный bean-компонент в вашем applicationContext-security.xml)

Затем вы можете получить доступ к API сервлета безопасности, как это делает Roo (найдите нижний колонтитул)..jspx, чтобы увидеть, как пишется ссылка для условного выхода из системы)

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

2 голосов
/ 13 октября 2018

j тег:

<%@taglib prefix="j" uri="http://java.sun.com/jsp/jstl/core" %>

сек тег:

<%@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>
1 голос
/ 29 января 2012

Насколько я знаю, по умолчанию Spring Security 3.0.x устанавливает a SecurityContextHolderRquestAwareFilter, так что вы можете получить объект Authentication, вызвав HttpServletRequest.getUserPrincipal(), и Вы также можете запросить роли, позвонив HttpServletRequest.isUserInRole().

0 голосов
/ 29 марта 2017

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 Я НАСЕЛЕН ЭТОЙ ПОЛЬЗОВАТЕЛЬСКИЙ объект 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) И, по-моему, я к нему обращаюсь:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...