Thymeleaf: sec: аутентификация отображается в ЛЮБОМ случае, тогда как sec: authorize при ЛЮБОМ случае - PullRequest
0 голосов
/ 07 октября 2018

Каждое <div> с указанным значением sec:authentication="..." отображается независимо от того, вошли вы в систему или нет.Даже явный false вызывает появление div.

С другой стороны <div> с sec:authorize="..." скрыты, даже с явным true.

Я попытался проверить зависимости Maven, конфигурацию Spring MVC, Spring Security Dialect в ServletContextConfig и многие другие ответы, но в моем случае не помогло ни одно решение.

index.html :

<!DOCTYPE html>
<html
       xmlns:th="http://www.thymeleaf.org"
       xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head>
    <meta charset="UTF-8"/>
    <title>blah blah</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet"/>
</head>

<body style="text-align: center;">    

<div sec:authentication="true">
    authentication - always
</div>

<div sec:authentication="false">
    authentication - never
</div>

<div class="container" sec:authentication="isAnonymous()">
    authentication - anonymous
</div>

<div class="container" sec:authentication="!isAnonymous()">
    authentication - not anonymous
</div>

<div class="container" sec:authentication="isAuthenticated()">
    authentication - authenticated
</div>

<div class="container" sec:authentication="!isAuthenticated()">
    authentication - not authenticated
</div>

<div sec:authorize="true">
    authorize - always
</div>

<div sec:authorize="false">
    authorize - never
</div>

<div class="container" sec:authorize="isAnonymous()">
    authorize - anonymous
</div>

<div class="container" sec:authorize="!isAnonymous()">
    authorize - not anonymous
</div>

<div class="container" sec:authorize="isAuthenticated()">
    authorize - authenticated
</div>

<div class="container" sec:authorize="!isAuthenticated()">
    authorize - not authenticated
</div>


<strong> Username: <span sec:authentication="name"></span> </strong>
<div th:text="${#authorization.getAuthentication()}">1</div>
<div th:text="${40}">1</div>




<!-- end of content! -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
</body>
</html>

Ожидаемый результат (при отсутствии входа в систему):

аутентификация - всегда

аутентификация -анонимная

аутентификация - не аутентифицирована

авторизация - всегда

авторизация - анонимно

авторизация - не аутентифицирована

Имя пользователя:Аноним

40

Фактический результат :

аутентификация - всегда

аутентификация - никогда

аутентификация - анонимная

аутентификация - не анонимная

аутентификация - аутентифицированная

аутентификация - не аутентифицированная

Имя пользователя:

40

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

В моем случае использование Spring Security 5 с thymeleaf-extras-springsecurity4 вызвало эту проблему.Если вы используете Spring Security 5, используйте вместо этого «thymeleaf-extras-springsecurity5».("thymeleaf-extras-springsecurity5" был выпущен недавно)

0 голосов
/ 07 октября 2018

В поисках новых и новых решений я нашел подходящее мне решение:

  1. Не должно быть ничего похожего на web.ignoring().antMatchers("/"); при SecurityConfig.configure().Т.е. страница, к которой вы хотите применить «фильтр авторизации», не должна быть настроена так, чтобы игнорировать ее из безопасности.
  2. Используйте sec:authorize, а не sec:authentication (это вызывает ошибку) в index.html.

Рабочая index.html :

<!DOCTYPE html>
<html
        xmlns:th="http://www.thymeleaf.org"
        xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
    <meta charset="UTF-8"/>
    <title>bla bla bla</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet"/>
</head>

<body style="text-align: center;">

<div sec:authorize="true">
    authorize - always
</div>

<div sec:authorize="false">
    authorize - never
</div>

<div class="container" sec:authorize="isAnonymous()">
    authorize - anonymous
</div>

<div class="container" sec:authorize="!isAnonymous()">
    authorize - not anonymous
</div>

<div class="container" sec:authorize="isAuthenticated()">
    authorize - authenticated
</div>

<div class="container" sec:authorize="!isAuthenticated()">
    authorize - not authenticated
</div>

<strong> Username: <span sec:authentication="name"></span> </strong>
<div th:text="${#authorization.getAuthentication()}">1</div>
<div th:text="${40}">1</div>

<!-- end of content! -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
</body>
</html>

Результат : (при входе в систему)

авторизация - всегда

авторизация - не анонимно

авторизация - аутентификация

Имя пользователя: test2

org.springframework.security.authentication.UsernamePasswordAuthenticationToken@00000000: Принципал: ....

40

(если не вошли в систему)

авторизовать - всегда

авторизовать - анонимно

авторизовать - не аутентифицировано

Имя пользователя: anonymousUser

org.springframework.security.authentication.UsernamePasswordAuthenticationToken@00000000: Принципал: ....

40

...