JavaRush /Курсы /Модуль 5. Spring /Основные понятия: аутентификация и авторизация

Основные понятия: аутентификация и авторизация

Модуль 5. Spring
10 уровень , 1 лекция
Открыта

Чтобы понять, как работают системы безопасности, нужно чётко различать два ключевых понятия: аутентификация и авторизация. Мы уже начали разговор о них, но теперь расставим акценты, чтобы вы в них не путались и запомнили раз и навсегда.

Представьте, что вы пришли в дом к другу. Первое, что вы делаете — это звоните в звонок. Друг смотрит в глазок проверяя, что это вы, а не какой-то непонятный тип. Это и есть аутентификация — проверка, что вы тот, за кого себя выдаёте. А затем друг решает: "Окей, я разрешаю тебе зайти в гостиную, но в спальню — ни-ни!" Это — авторизация.

В контексте приложений и систем безопасности:

  • Аутентификация отвечает на вопрос: "Кто ты вообще такой?" Мы проверяем подлинность пользователя: логин, пароль, иногда отпечаток пальца, или даже танец с бубном.
  • Авторизация — другой уровень: "Окей, я знаю, кто ты, но что ты можешь делать в моём приложении?" Здесь всё завязано на права доступа и роли.

Как работает аутентификация в Spring Security?

Spring Security предоставляет широкий спектр инструментов для реализации аутентификации. Есть два ключевых аспекта: определение способа аутентификации и хранение данных о пользователях. Давайте разберёмся.

Типы аутентификации

  1. Форм-логин — самый базовый метод. Пользователь вводит имя и пароль в HTML-форме, данные отправляются на сервер и проверяются. Если всё ок — доступ открыт.

    Пример настройки:

    
    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .anyRequest().authenticated() // Все запросы требуют аутентификации
                    .and()
                .formLogin() // Включаем аутентификацию через форму
                    .loginPage("/login") // Указание пути к кастомной странице логина
                    .permitAll();
        }
    }
    
  2. Basic Authentication — простая аутентификация с передачей логина/пароля в каждом запросе (плохой вариант для продакшена без HTTPS).
  3. Token-based Authentication (например, JWT) — вместо передачи логина/пароля на каждом шаге, мы используем токен, который подтверждает аутентификацию.
  4. OAuth2/OpenID Connect — более сложная схема, о ней мы поговорим дальше в курсе.

Где хранить пользователей и пароли?

  • In-memory — удобно для тестирования. Всё хранится в оперативке, исчезает при перезапуске.

    Пример:

    
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password("{noop}password").roles("USER")
            .and()
            .withUser("admin").password("{noop}admin").roles("ADMIN");
    }
    
  • В базе данных — реальный способ для продакшена. Мы используем UserDetailsService, чтобы предоставить информацию о пользователях из базы данных.
  • LDAP/Active Directory — интеграция с корпоративными системами.

Как работает авторизация в Spring Security?

Мы разобрались, кто наш пользователь (аутентификация), но теперь следующий вопрос: "А что ему можно делать?"

Разрешения на основе ролей (Role-based Access Control, RBAC)

Spring Security использует концепцию ролей для управления доступом. У пользователя могут быть роли, например, ROLE_USER или ROLE_ADMIN. На основе этих ролей мы конфигурируем доступ к различным частям приложения.

Пример:


@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN") // Только роль ADMIN
            .antMatchers("/user/**").hasAnyRole("USER", "ADMIN") // Роли USER и ADMIN
            .anyRequest().authenticated();
}

Авторизация на уровне методов

Иногда нужно ограничить доступ не к URL, а к конкретным методам в вашем коде. Например, только администратор может удалять пользователей.

Пример с аннотацией @PreAuthorize:


@Service
public class UserService {

    @PreAuthorize("hasRole('ADMIN')") // Только администратор может
    public void deleteUser(String username) {
        // Логика удаления пользователя
    }
}

Реальные сценарии

Сценарий 1: Только зарегистрированные пользователи могут просматривать профили

Мы хотим, чтобы страница профиля была доступна только аутентифицированным пользователям. Это легко настраивается:


http
    .authorizeRequests()
        .antMatchers("/profile/**").authenticated() // Только аутентифицированные
        .and()
    .formLogin();

Сценарий 2: Администратор может добавлять новые данные, но не изменять

В вашей бизнес-логике администраторы могут добавлять записи, но изменения — это прерогатива менеджеров. Используем метод-настроек:


@Service
public class DataService {

    @PreAuthorize("hasRole('ADMIN')")
    public void addData(Data data) {
        // Логика добавления данных
    }

    @PreAuthorize("hasRole('MANAGER')")
    public void updateData(Data data) {
        // Логика обновления данных
    }
}

Общие ошибки новичков

Одной из самых частых ошибок при настройке аутентификации/авторизации является использование неправильного порядка правил. Например, если вы укажете anyRequest().permitAll() до других правил, ваше приложение позволит доступ всем.

Пример неправильного порядка:


http
    .authorizeRequests()
        .anyRequest().permitAll() // Открывает всё для всех!
        .antMatchers("/admin/**").hasRole("ADMIN");

Правильный порядок:


http
    .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .anyRequest().permitAll();

Так что будьте внимательны с порядком правил!


Как это применяется в реальной жизни?

Мы строим приложение, в котором безопасность — неотъемлемая часть. Навыки настройки ролей и аутентификации пригодятся вам везде, от простого интернет-магазина до сложных систем управления финансами. Например, если вы разрабатываете приложение для банка, вам придётся учитывать не только роли пользователей, но и уровни их доступа, сложные системы токенов и многое другое.

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


На следующей лекции мы более подробно рассмотрим аннотации Spring Security, такие, как @Secured, @PreAuthorize и другие, которые помогут вам управлять безопасностью на уровне кода.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ