Перейти к основному содержимому

Введение в Spring Security Taglibs

· 3 мин. чтения

1. Обзор

В этом руководстве мы рассмотрим Spring Security Taglibs , который обеспечивает базовую поддержку для доступа к информации о безопасности и применения ограничений безопасности в 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. Объявление 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 .

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

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

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

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

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

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

6. Тег csrfInput

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

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

Но если вместо этого мы хотим использовать <form> , мы можем вручную указать, где 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 .