Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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.

Ответ 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}" >