@RolesAllowed против @PreAuthorize против @Secured

У меня есть основное приложение SpringBoot. используя Spring Инициализатор, встроенный Tomcat, механизм шаблонов Thymeleaf и пакет как исполняемый JAR файл.

Я хочу защитить контроллер:

@Controller
@RequestMapping("/company")
@RolesAllowed({"ROLE_ADMIN"})
@PreAuthorize("hasRole('ADMIN')")
@Secured("ADMIN")
public class CompanyController {
}

Я знаю, что есть разные варианты, но я не знаю, что я должен использовать

Ответ 1

Аннотации безопасности

Все @PreAuthorize, @RolesAllowed и @Secured являются аннотациями, которые позволяют настроить безопасность метода. Они могут применяться как к отдельным методам, так и на уровне класса, в последнем случае ограничения безопасности будут применяться ко всем методам в классе.

Безопасность на уровне метода достигается с помощью прокси Spring AOP.

@PreAuthorize

@PreAuthorize аннотация позволяет указать ограничения доступа к методу, использующему язык выражений Spring (SpEL). Эти ограничения оцениваются перед выполнением метода и могут привести к тому, что выполнение метода будет отклонено, если ограничения не будут выполнены. Аннотация @PreAuthorize является частью среды Spring Security.

Чтобы иметь возможность использовать @PreAuthorize, атрибут prePostEnabled в @EnableGlobalMethodSecurity аннотация должна быть установлена на true:

@EnableGlobalMethodSecurity(prePostEnabled=true)

@RolesAllowed

@RolesAllowed аннотация берет свое начало в стандарте безопасности Java JSR-250. Этот аннотация более ограничена, чем аннотация @PreAuthorize, поскольку она поддерживает только безопасность на основе ролей.

Чтобы использовать аннотацию @RolesAllowed, библиотека, содержащая эту аннотацию, должна находиться в пути к классам, поскольку она не является частью Spring Security. Кроме того, для атрибута jsr250Enabled аннотации @EnableGlobalMethodSecurity необходимо установить значение true:

@EnableGlobalMethodSecurity(jsr250Enabled=true)

@Secured

@Secured аннотация - это устаревшая аннотация Spring Security 2, которую можно использовать для настройки безопасности метода. Он поддерживает не только безопасность на основе ролей, но и не поддерживает использование Spring Expression Language (SpEL) для определения ограничений безопасности. Над этой аннотацией рекомендуется использовать аннотацию @PreAuthorize в новых приложениях.

Поддержка аннотации @Secured должна быть явно включена в @EnableGlobalMethodSecurity аннотация с использованием атрибута securedEnabled:

@EnableGlobalMethodSecurity(securedEnabled=true)

Какие аннотации безопасности позволяют использовать SpEL

В следующей таблице показана поддержка Spring Expression Language в аннотациях безопасности, которые можно использовать с Spring Security 5:

╔═════════════════════╦═══════════════════╗
║ Security Annotation ║ Has SpEL Support? ║
╠═════════════════════╬═══════════════════╣
║  @PreAuthorize      ║        yes        ║
╠═════════════════════╬═══════════════════╣
║  @PostAuthorize     ║        yes        ║
╠═════════════════════╬═══════════════════╣
║  @PreFilter         ║        yes        ║
╠═════════════════════╬═══════════════════╣
║  @PostFilter        ║        yes        ║
╠═════════════════════╬═══════════════════╣
║  @Secured           ║        no         ║
╠═════════════════════╬═══════════════════╣
║  @RolesAllowed      ║        no         ║
╚═════════════════════╩═══════════════════╝

Ответ 2

@Secured и @RolesAllowed выполняют идентичные функции в Spring. Различие состоит в том, что @Secured является специфичной для Spring аннотацией, а @RolesAllowed является стандартной аннотацией Java (JSR250). Ни одна из этих аннотаций не поддерживает SpEL.

@PreAuthorize - еще одна аннотация для Spring. Вы можете выполнять намного более мощные операции с @PreAuthorize, используя SpEL. Вы можете написать выражения для вызова метода limit на основе ролей/разрешений, текущего аутентифицированного пользователя и аргументов, переданных в метод.

@PreAuthorize("hasRole('ADMIN') or #user.id == authentication.name")
public void deleteUser(User user) {
    ...
}

http://docs.spring.io/autorepo/docs/spring-security/4.0.x/reference/html/el-access.html#el-common-built-in


Что касается того, чтобы использовать, это действительно зависит от вас. @Secure и @PreAuthorize свяжут ваш код с Spring. Если привязка к Spring не является проблемой или вам нужно выполнять более мощные операции, используйте @PreAuthorize.

Ответ 3

Все они в основном одинаковы для вашей цели, но @PreAuthorize лучше всего подходит для контроллеров и методов контроллера. @Secured и @RolesAllowed предназначены для описания атрибутов безопасности уровня обслуживания.

Также обратите внимание, что для аннотации @PreAuthorize для работы вы должны определить класс конфигурации:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
...
}