Главная » Spring » Минимальная настройка безопасности Spring

0

В ранних версиях Spring Security для настройки основных ме- ханизмов системы безопасности требовалось добавлять в конфигу- рационные XML-файлы огромное количество элементов. Но в по- следних версиях Spring Security достаточно добавить следующий фрагмент:

<http  auto-config="true">

<intercept-url pattern="/**" access="ROLE_SPITTER" />

</http>

Эти три строчки обеспечивают перехват запросов для всех URL (как следует из значения атрибута pattern элемента <intercept-url>) и разрешают доступ к содержимому только аутентифицированным пользователям, обладающим привилегией ROLE_SPITTER. Элемент

<http> автоматически настраивает компонент FilterChainProxy (кото- рому делегирует фильтрацию объект DelegatingFilterProxy, настроен- ный в файле web.xml) и все остальные компоненты в цепочке, реа- лизующие фильтрацию.

В дополнение к этим компонентам фильтров можно получить дополнительные возможности, установив атрибут auto-config в зна- чение true. Автоматическая настройка включает в приложение страницу аутентификации, поддержку аутентификации средствами протокола HTTP и поддержку завершения сеанса работы. В дей- ствительности установка атрибута auto-config в значение true экви- валентна явной настройке этих возможностей, как показано ниже:

<http>

<form-login />

<http-basic />

<logout />

<intercept-url pattern="/**" access="ROLE_SPITTER" />

</http>

Познакомимся с ними поближе, чтобы понять, как ими пользо- ваться.

Аутентификация с помощью формы

Одним из преимуществ установки атрибута auto-config в значение true является автоматическое создание страницы аутентификации фреймворком Spring Security. В листинге 10.3 представлена размет- ка HTML этой формы.

Листинг 10.3. Фреймворк Spring Security может автоматически создавать простую форму аутентификации

<html>

<head><title>Login   Page</title></head>

<body     onload=’document.f.j_username.focus();’>

<h3>Login with Username and Password</h3>

<form   name=’f’  method=’POST’

action=’/Spitter/j_spring_security_check’>    <!–  Путь  к  фильтру  –>

<table>                                                                 <!–  аутентификации  –>

<tr><td>User:</td><td>          <!–  Поле  ввода  имени  пользователя  –>

<input  type=’text’  name=’j_username’  value=”>

</td></tr>

<tr><td>Password:</td><td> <!– Поле ввода пароля –>

<input type=’password’ name=’j_password’/>

</td></tr>

<tr><td  colspan=’2′>

<input name="submit" type="submit"/>

</td></tr>

<tr><td  colspan=’2′>

<input name="reset" type="reset"/>

</td></tr>

</table>

</form>

</body>

</html>

Адрес URL автоматически сгенерированной формы аутентифи- кации складывается из базового адреса URL приложения и отно- сительного  пути  /spring_security_login.  Например,  при  обращении к приложению Spitter на локальном компьютере этот URL будет иметь вид: http://localhost:8080/Spitter/spring_security_login.

На первый взгляд возможность автоматического создания формы аутентификации выглядит большим преимуществом. Но эта форма слишком проста и не отличается эстетической привлекательностью, поэтому в большинстве случаев она заменяется специально создан- ной формой.

Чтобы добавить в приложение свою форму аутентификации, не- обходимо настроить элемент <form-login>:

<http   auto-config="true"   use-expressions="false">

<form-login login-processing-url="/static/j_spring_security_check" login-page="/login"

authentication-failure-url="/login?login_error=t"/>

</http>

Атрибут login определяет новый относительный путь к страни- це аутентификации. В данном случае указывается, что страница аутентификации будет иметь относительный путь /login, который в конечном итоге обслуживается контроллером Spring MVC. Ана- логично, в случае неудачной попытки аутентификации, атрибут authentication-failure-url будет отправлять пользователя обратно на страницу аутентификации.

Обратите   внимание   на   значение   /static/j_spring_security_check в атрибуте login-processing-url. Это URL, куда будет отправляться форма для аутентификации пользователя.

Даже если вы не планируете использовать автоматически сгене-

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

су /Spitter/j_spring_security_check. А также что имя пользователя и пароль должны отправляться в составе запроса, в виде параметров с именами j_username и j_password. Обладая этими знаниями, не со- ставит труда создать собственную страницу аутентификации.

Новая страница аутентификации для приложения Spitter реали- зована в виде страницы JSP, которая обслуживается контроллером Spring MVC. Сама страница представлена ниже, в листинге 10.4.

Листинг 10.4. Приложение Spitter использует собственную JSP-страницу аутентификации

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

<div>

<h2>Sign in to Spitter</h2>

<p>

If you’ve been using Spitter from your phone, then  that’s  amazing…we  don’t  support  IM  yet.

</p>

<!–  Путь  к  фильтру  аутентификации  –>

<spring:url var="authUrl" value="/static/j_spring_security_check" />

<form  method="post"  class="signin"  action="${authUrl}">

<fieldset>

<table  cellspacing="0">

<tr>

<th><label for="username_or_email">Username or Email</label></th>

<td><input id="username_or_email"

name="j_username"

type="text"  />          <!–  Поле  ввода  имени  пользователя  –>

</td>

</tr>

<tr>

<th><label  for="password">Password</label></th>

<td><input id="password"

name="j_password"

type="password" />   <!– Поле ввода пароля –>

<small><a  href="/account/resend_password">Forgot?</a></small>

</td>

</tr>

<tr>

<th></th>

<td><input id="remember_me"

name="_spring_security_remember_me"     type="checkbox"/>      <!–  Флажок  "запомнить  меня"  –>

<label  for="remember_me"

class="inline">Remember me</label></td>

</tr>

<tr>

<th></th>

<td><input name="commit" type="submit" value="Sign In" /></td>

</tr>

</table>

</fieldset>

</form>

<script     type="text/javascript"> document.getElementById(‘username_or_email’).focus();

</script>

</div>

Эта страница аутентификации существенно отличается от стра- ницы, генерируемой фреймворком Spring Security автоматически, тем не менее она также отправляет имя пользователя и пароль в параметрах j_username и j_password. Все остальное – лишь декорации.

Обратите также внимание на присутствие в листинге 10.4 флажка remember me (запомнить меня). Подробнее о том, как он действует, будет рассказываться в разделе 9.4.4. А сейчас познакомимся с под- держкой аутентификации посредством протокола HTTP.

Аутентификация средствами протокола HTTP

Аутентификация с использованием формы идеально подходит для людей, пользующихся приложением. Но в главе 11 будет по- казано, как превращать страницы веб-приложений в RESTful API, когда пользователем приложения является другое приложение и ис- пользовать форму аутентификации становится неудобно.

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

Но это лишь внешнее проявление действия механизма в веб- браузере. В действительности запрос на аутентификацию возвра- щается в виде ответа HTTP 401, указывающего на необходимость передать имя пользователя и пароль в теле запроса. Эта возмож-

ность отлично подходит для REST-клиентов, позволяя им аутенти- фицировать себя при пользовании услугами приложения.

Аутентификация средствами протокола HTTP включается с по- мощью элемента <http-basic> и не требует большого количества на- строек – она может быть либо включена, любо выключена. Поэтому не будем больше останавливаться на этой теме и двинемся дальше, где нас ждет элемент <logout>.

Завершение сеанса работы

Элемент <logout> настраивает фильтр Spring Security, который бу- дет закрывать сеанс работы с пользователем. При использовании с настройками по умолчанию элемент <logout> отображается на адрес

/j_spring_security_logout. Но, чтобы устранить конфликт с настройка- ми DispatcherServlet, необходимо переопределить URL фильтра, как это делалось для формы аутентификации. Для этого следует опре- делить атрибут logout-url:

<logout   logout-url="/static/j_spring_security_logout"/>

На этом завершается обсуждение возможностей, предоставляе- мых автоматически. Но исследование Spring Security не заканчива- ется. Познакомимся поближе с элементом <intercept-url> и посмот- рим, как с его помощью управлять доступом на уровне запросов.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии