Выбрать главу

   .antMatchers("/design", "/orders")

   .access("hasRole('ROLE_USER') && " +

     "T(java.util.Calendar).getInstance().get("+

     "T(java.util.Calendar).DAY_OF_WEEK) == " +

     "T(java.util.Calendar).TUESDAY")

   .antMatchers(“/”, "/**").access("permitAll");

}

С SpEL-based ограничениями безопасности возможности практически безграничны. Бьюсь об заклад, что вы уже придумываете интересные ограничения безопасности, основанные на SpEL.

Потребности в авторизации для приложения Taco Cloud удовлетворяются простым использованием access() и выражений SpEL в листинге 4.9. Теперь давайте посмотрим  настройки страницы входа в систему приложения Taco Cloud.

4.3.2 Создание пользовательской страницы входа

Default-ная страница входа намного лучше, чем неуклюжее диалоговое окно HTTP basic, с которого вы начали, но она все еще довольно просто и не совсем вписывается в стиль остальной части приложения Taco Cloud.

Чтобы заменить встроенную страницу входа, сначала необходимо сообщить Spring Security, по какому пути будет находиться ваша пользовательская страница входа. Это можно сделать, вызвав formLogin() для объекта HttpSecurity, переданного в configure():

@Override

protected void configure(HttpSecurity http) throws Exception {

 http.authorizeRequests()

   .antMatchers("/design", "/orders")

   .access("hasRole('ROLE_USER')")

   .antMatchers(“/”, "/**").access("permitAll")

   .and()

   .formLogin()

   .loginPage("/login");

}

Обратите внимание, что перед вызовом formLogin() этот раздел конфигурации и предыдущий раздел соединяются вызовом and(). Метод and() означает, что вы завершили настройку авторизации и готовы применить некоторые дополнительные настройки HTTP. Вы будете использовать and() несколько раз, когда начнете новые разделы конфигурации.

После перемычки and() вызовите formLogin(), чтобы начать настройку пользовательской формы входа. Вызов loginPage() после этого определяет путь, где будет предоставлена ваша пользовательская страница входа. Когда Spring Security определит, что пользователь не прошел проверку подлинности и должен войти в систему, он перенаправит их по этому пути.

Теперь необходимо предоставить контроллер, обрабатывающий запросы по этому пути. Поскольку ваша страница входа в систему будет довольно простой (ничего, кроме представления) достаточно легко объявить ее контроллером представления в WebConfig. Следующие метод addViewControllers() устанавливает login page view контроллер наряду с контроллером представления, для "/"  home контроллера:

@Override

public void addViewControllers(ViewControllerRegistry registry) {

 registry.addViewController("/").setViewName("home");

 registry.addViewController("/login");

}

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

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">

 <head>

   <title>Taco Cloud</title>

 </head>

 <body>

   <h1>Login</h1>

   <img th:src="@{/images/TacoCloud.png}"/>

   <div th:if="${error}"> Unable to login. Check your username and password. </div>

   <p>New here? Click

     <a th:href="@{/register}">here</a> to register.</p>

   <!-- tag::thAction[] -->

   <form method="POST" th:action="@{/login}" id="loginForm">

   <!-- end::thAction[] -->

     <label for="username">Username: </label>

     <input type="text" name="username" id="username" /><br/>

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

     <input type="password" name="password" id="password" /><br/>

     <input type="submit" value="Login"/>

   </form>

 </body>

</html>

Ключевые вещи, которые следует отметить об этой странице входа в систему, - это путь, который она публикует, и имена полей имени пользователя и пароля.  По умолчанию Spring Security прослушивает запросы на вход в /login и ожидает, что поля username и password будут называться username и password. Но это можено настроить. Например, следующая конфигурация настраивает путь и имена полей :

.and().formLogin()

 .loginPage("/login")

 .loginProcessingUrl("/authenticate")

 .usernameParameter("user")

 .passwordParameter("pwd")

Здесь вы указываете, что Spring Security должна прослушивать запросы /authenticate для обработки запросов на вход. Кроме того, поля username и password теперь должны быть названы user и pwd.

По умолчанию успешный вход приведет пользователя непосредственно к странице, на которую он переходил, когда Spring Security определила, что ему необходимо залогиниться. Если бы пользователь должен был перейти непосредственно на страницу входа в систему, успешный вход в систему привел бы его к корневому пути (например, к домашней странице). Но вы можете изменить это, указав страницу на которую переходить при успешном входе в систему по умолчанию: