«1. Обзор

В этом руководстве мы рассмотрим библиотеки Spring Security Taglib, которые обеспечивают базовую поддержку доступа к информации о безопасности и применения ограничений безопасности в JSP.

2. Зависимости Maven

Прежде всего, давайте добавим зависимость spring-security-taglibs в наш pom.xml:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

3. Объявление Taglibs

Теперь, прежде чем мы можно использовать теги, нам нужно импортировать taglib в начало нашего JSP-файла:

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

После этого мы сможем указать теги Spring Security с префиксом sec.

4. Тег авторизации

4.1. Выражения доступа

В наших приложениях у нас может быть информация, которая должна отображаться только для определенных ролей или пользователей.

В этом случае мы можем использовать тег авторизации:

<sec:authorize access="!isAuthenticated()">
  Login
</sec:authorize>
<sec:authorize access="isAuthenticated()">
  Logout
</sec:authorize>

Кроме того, мы можем проверить, есть ли у аутентифицированного пользователя определенные роли:

<sec:authorize access="hasRole('ADMIN')">
    Manage Users
</sec:authorize>

И мы можем использовать любое выражение Spring Security как наше значение для доступа:

    hasAnyRole(‘ADMIN’,’USER’) возвращает true, если текущий пользователь имеет какую-либо из перечисленных ролей isAnonymous() возвращает true, если текущий принципал является анонимным пользователем isRememberMe() возвращает true если текущий принципал является пользователем типа «запомнить меня», функция isFullyAuthenticated() возвращает true, если пользователь прошел аутентификацию и не является ни анонимным, ни пользователем с функцией «запомнить меня»

4.2. url

Помимо этого, мы можем проверить наличие пользователей, которым разрешено отправлять запросы на определенные URL-адреса:

<sec:authorize url="/userManagement">
    <a href="/userManagement">Manage Users</a>
</sec:authorize>

4.3. Отладка

Могут быть случаи, когда нам нужно больше контроля над пользовательским интерфейсом, например, в сценариях тестирования. Вместо того, чтобы Spring Security пропустил рендеринг этих неавторизованных разделов, мы можем установить spring.security.disableUISecurity=true, скажем, в нашем файле application.properties.

Когда мы это сделаем, тег авторизации не будет скрывать свое содержимое. Вместо этого он будет обертывать содержимое тегами \u003cspan class=†securityHiddenUI\u003e… \u003c/span\u003e. Затем мы можем сами настроить рендеринг с помощью CSS.

Помните, однако, что скрытие содержимого с помощью CSS небезопасно! Пользователь может просто просмотреть источник, чтобы увидеть несанкционированный контент.

5. Тег аутентификации

В других случаях мы можем захотеть отобразить информацию о вошедшем в систему пользователе, например сказать что-то вроде «Добро пожаловать, Кэрол!» на сайте.

Для этого мы используем тег аутентификации:

<sec:authorize access="isAuthenticated()">
    Welcome Back, <sec:authentication property="name"/>
</sec:authorize>

6. Тег csrfInput

Надеюсь, в нашем приложении включена защита Spring Security от CSRF!

Если мы это сделаем, то Spring Security уже вставит для нас скрытый ввод формы CSRF внутри тегов \u003cform:form\u003e.

Но если вместо этого мы хотим использовать \u003cform\u003e, мы можем вручную указать, где Spring Security должен разместить это скрытое поле ввода, используя csrfInput:

<form method="post" action="/do/something">
    <sec:csrfInput />
    Text Field:<br />
    <input type="text" name="textField" />
</form>

Если защита CSRF не включена, этот тег ничего не выводит.

7. Тег csrfMetaTags

Или, если мы хотим получить доступ к токену CSRF в Javascript, мы, вероятно, захотим вставить токен как метатег.

Мы можем сделать это с помощью тега csrfMetaTags:

<html>
    <head>
        <title>JavaScript with CSRF Protection</title>
        <sec:csrfMetaTags />
        <script type="text/javascript" language="javascript">
            var csrfParameter = $("meta[name='_csrf_parameter']").attr("content");
            var csrfHeader = $("meta[name='_csrf_header']").attr("content");
            var csrfToken = $("meta[name='_csrf']").attr("content");
        </script>
    </head>
    <body>
    ...
    </body>
</html>

Опять же, если защита CSRF не включена, этот тег ничего не выводит.

8. Заключение

В этой быстрой статье мы сосредоточились на некоторых распространенных случаях использования taglib Spring Security.

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

Все примеры, как всегда, можно найти на Github.