Лекция 11-12
Тема: Работа со Spring Security. Понятие аутентификации и авторизации. Расширение WebSecurityConfigurerAdapter. Способы formLogin() и httpBasic(). Хеширование паролей.
Spring Security – это фреймворк обеспечения безопасности, предоставляющий возможность декларативного управления безопасностью приложений на основе фреймворка Spring.
Создадим новый проект, который включает модуль Spring Security или добавим в существующий проект зависимость
<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
...
</dependencies>При попытке перейти на любой URL-адрес проекта нас перенаправит на форму ввода логина и пароля

По умолчанию, логином является user, а пароль генерируется каждый раз при старте приложения.

Если вы ввели правильно логин и пароль, то сервер переадресует вас на указанный URL.

В файле application.properties вы можете указать желаемый логин и пароль для пользователя по умолчанию (в данной лекции будет использоваться конфигурация с помощью языка yaml).
Фреймворк Spring Security "из коробки" предоставляет вам возможность простой версии так называемой form-based аутентификации. Если быть точнее, то по умолчанию, Spring Security реализует следующее поведение:
добавляет обязательный процесс аутентификации для всех URL;
добавляет форму для входа;
обрабатывает ошибки формы ввода;
создает пользователя по умолчанию и генерирует пароль.
Основные понятия, связанные со Spring Security:
Authentication
Authorization
Principal - текущий залогиненный пользователь или текущий залогиненный аккаунт (если у одного физического лица или программы есть несколько аккаунтов, то тогда ему будет соответствовать несколько возможных principal`ов). Иногда, в общем случае, principal - это субъект, который принимает участие в осуществлении процедур безопасности. В качестве principal могут выступать люди, компьютеры, службы, процессы или их группа;
Granted Authority - ;
Role - .
Настройка процесса аутентификации в Spring
Для того, чтобы сконфигурировать процесс аутентификации, необходимо создать объект AuthenticationManager, в котором следует указать требуемые параметры аутентификации. Объект типа AuthenticationManager обычно настраивают с помощью builder`а, который имеет тип AuthenticationManagerBuilder.
Добавим класс SecurityConfig, который наследуется от класса WebSecurityConfigurerAdaper. Также укажем аннотации @Configuration (это означает, что данный класс является конфигурационным) и @EnableWebSecurity (это означает, что данный класс является содержит настройки для защиты веб-приложения).
Переопределим метод configure(), который принимает на вход объект типа AuthenticationManagerBuilder (обратите внимание, что нам нужна именно эта версия перегруженного метода).
Для начала укажем, что источник аутентификации это жестко прописанные пользователи (так называемая inMemoryAuthentication(). Далее указываем логин, пароль и роль пользователя.
Если необходимо указать несколько пользователей, после параметров первого пользователя вызываете метод and() после чего указываете параметры следующего пользователя.
Хеширование паролей
Хранить пароли без хеширования является грубейшим нарушением правил безопасности, поэтому нам необходимо добавить процесс хеширования пароля в нашу систему.
Не будем вдаваться в подробности различных алгоритмов хеширования пароля, просто скажем, что на даннай момент рекомендуемым является алгоритм Bcrypt. Для обеспечения хеширования, вы можете поступить несколькими способами.
Первый способ - создайте Bean, который будет возвращать объект Encoder`а и добавьте его как метод конфигурационного класса.

Далее найдите в интернете генератор хеша с помощью алгоритма Bcrypt, скопируйте хеш для вашего пароля в метод password.
Если не хотите использовать Bean для хеширования пароля, можете в начале хеша добавить обозначение, что это хеш для алгоритма bcrypt.
Настройка процесса авторизации
Добавим класс контроллера
Изменим SecurityConfig
Изменим formLogin() на httpBasic().
Создадим MyUserDetailsService
Создадим MyUserDetails
Добавим в pom.xml
Настроим подключение к БД
Добавим сущность User
Изменим MyUserDetailsService
Создадим UserRepository
Изменим MyUserDetails
Last updated
Was this helpful?