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 .