← Назад к вопросам

Что такое авторизация?

1.0 Junior🔥 131 комментариев
#Безопасность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Авторизация в веб-приложениях

Авторизация — это процесс определения прав доступа аутентифицированного пользователя к конкретным ресурсам, функциям или операциям в приложении.

Различие: Аутентификация vs Авторизация

Аутентификация — подтверждение личности: "Ты действительно тот, кем себя представляешь?"

Авторизация — определение прав доступа: "Что ты можешь делать в системе?"

Пример: вход в банк через пароль — это аутентификация. Возможность просмотреть свой счёт — это авторизация.

Основные модели авторизации

1. RBAC (Role-Based Access Control)

Пользователю назначается роль, которая определяет его права:

@RestController
@RequestMapping("/api/users")
public class UserController {
    @GetMapping
    @PreAuthorize("hasRole(ADMIN)")
    public List<User> getAllUsers() {
        return userService.findAll();
    }
    
    @GetMapping("/{id}")
    @PreAuthorize("hasAnyRole(USER,ADMIN)")
    public User getUser(@PathVariable Long id) {
        return userService.findById(id);
    }
}

Основные роли: ADMIN, USER, MODERATOR, GUEST.

2. ABAC (Attribute-Based Access Control)

Права определяются по сложным условиям с атрибутами:

@PreAuthorize(
    "#post.department == authentication.principal.department"
)
public void editPost(Post post) { }

3. ACL (Access Control List)

Для каждого ресурса определяется список пользователей с правами доступа.

Реализация в Spring Security

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/api/public/**").permitAll()
                .antMatchers("/api/admin/**").hasRole("ADMIN")
                .antMatchers("/api/users/**").hasAnyRole("USER","ADMIN")
                .anyRequest().authenticated()
            .and()
            .formLogin()
            .and()
            .logout();
        
        return http.build();
    }
}

JWT токены с авторизацией

public class JwtTokenProvider {
    public String generateToken(UserDetails user) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("roles", user.getAuthorities());
        
        return Jwts.builder()
            .setClaims(claims)
            .setSubject(user.getUsername())
            .setIssuedAt(new Date())
            .setExpiration(new Date(System.currentTimeMillis() + 86400000))
            .signWith(SignatureAlgorithm.HS512, secretKey)
            .compact();
    }
}

Custom авторизационный сервис

@Service
public class AuthorizationService {
    
    public boolean canEditPost(User user, Post post) {
        if (user.hasRole("ADMIN")) return true;
        if (post.getAuthor().getId().equals(user.getId())) return true;
        if (user.hasRole("MODERATOR") && 
            user.getCategory().equals(post.getCategory())) {
            return true;
        }
        return false;
    }
}

Лучшие практики

✓ Проверяй авторизацию на бэкенде, не полагайся на клиент ✓ Используй принцип наименьших привилегий ✓ Логируй попытки несанкционированного доступа ✓ Используй HTTPS для передачи токенов ✓ Регулярно проверяй права доступа

✗ Не доверяй браузерному localStorage ✗ Не отправляй пароли в логах ✗ Не кодируй права в клиентском коде ✗ Не используй слишком гранулярные права ✗ Не забывай про механизм управления правами

Примеры реальных сценариев

GET /api/users/123 — видно всем аутентифицированным
GET /api/users/123/settings — только сам пользователь или админ
GET /api/posts — все (если статус published)
POST /api/posts — только залогины
PUT /api/posts/123 — только автор или модератор
DELETE /api/posts/123 — только автор, модератор или админ
GET /api/admin/users — только админы

Заключение

Авторизация — это критически важная часть безопасности. Выбор правильной модели зависит от требований приложения. Spring Security предоставляет мощные инструменты для реализации гибких и безопасных систем авторизации в Java.

Что такое авторизация? | PrepBro