Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Авторизация в веб-приложениях
Авторизация — это процесс определения прав доступа аутентифицированного пользователя к конкретным ресурсам, функциям или операциям в приложении.
Различие: Аутентификация 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.