Проверка авторизации для выполнения методов
Создадим аспект, который будет:
Проверять, имеет ли пользователь доступ к выполнению метода.
Блокировать вызов метода, если доступ запрещён.
Шаг 1: Создание аннотации для ограничения доступа
Шаг 2: Аспект для проверки безопасности
Шаг 3: Применение аннотации Secured
Теперь можно использовать аннотацию @Secured для методов, которые требуют проверки безопасности.
Шаг 4: Проверка
Создадим контроллер для вызова методов:
Если вызвать метод deleteUser с текущей ролью USER, выбросится исключение:
Шаг 5: Логирование в аспекте
Вы можете расширить аспект, добавив логирование успешных или неуспешных проверок безопасности:
#Java #Training #Spring #AOP #AOP_for_security
Создадим аспект, который будет:
Проверять, имеет ли пользователь доступ к выполнению метода.
Блокировать вызов метода, если доступ запрещён.
Шаг 1: Создание аннотации для ограничения доступа
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Secured {
String role(); // Роль, необходимая для доступа
}
Шаг 2: Аспект для проверки безопасности
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.JoinPoint;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class SecurityAspect {
// Перехватываем методы с аннотацией @Secured
@Before("@annotation(secured)")
public void checkAccess(JoinPoint joinPoint, Secured secured) {
String requiredRole = secured.role();
String userRole = getCurrentUserRole(); // Эмуляция получения роли пользователя
if (!userRole.equals(requiredRole)) {
throw new SecurityException("Access denied: required role is " + requiredRole);
}
System.out.println("Access granted to method: " + joinPoint.getSignature());
}
private String getCurrentUserRole() {
// Для примера, возвращаем роль текущего пользователя
return "USER"; // Например, текущая роль пользователя — "USER"
}
}
Шаг 3: Применение аннотации Secured
Теперь можно использовать аннотацию @Secured для методов, которые требуют проверки безопасности.
import org.springframework.stereotype.Service;
@Service
public class AdminService {
@Secured(role = "ADMIN")
public void deleteUser(Long id) {
System.out.println("Deleting user with ID: " + id);
}
@Secured(role = "USER")
public String getUserData(Long id) {
System.out.println("Fetching user data...");
return "User data for ID: " + id;
}
}
Шаг 4: Проверка
Создадим контроллер для вызова методов:
@RestController
public class AdminController {
private final AdminService adminService;
public AdminController(AdminService adminService) {
this.adminService = adminService;
}
@DeleteMapping("/admin/users/{id}")
public void deleteUser(@PathVariable Long id) {
adminService.deleteUser(id); // Проверка роли ADMIN
}
@GetMapping("/admin/users/{id}")
public String getUserData(@PathVariable Long id) {
return adminService.getUserData(id); // Проверка роли USER
}
}
Если вызвать метод deleteUser с текущей ролью USER, выбросится исключение:
Access denied: required role is ADMIN
Шаг 5: Логирование в аспекте
Вы можете расширить аспект, добавив логирование успешных или неуспешных проверок безопасности:
@Before("@annotation(secured)")
public void checkAccess(JoinPoint joinPoint, Secured secured) {
String requiredRole = secured.role();
String userRole = getCurrentUserRole();
if (!userRole.equals(requiredRole)) {
System.out.println("Access denied for method: " + joinPoint.getSignature());
throw new SecurityException("Access denied: required role is " + requiredRole);
}
System.out.println("Access granted for method: " + joinPoint.getSignature());
}
#Java #Training #Spring #AOP #AOP_for_security
👍2