Какая разница между @Secured и @PreAuthorize в spring безопасности 3?
Мне непонятно, в чем разница между spring безопасностью между:
@PreAuthorize("hasRole('ROLE_USER')")
public void create(Contact contact)
И
@Secured("ROLE_USER")
public void create(Contact contact)
Я понимаю, что PreAuthorize может работать с spring el, но в моем примере существует ли реальная разница?
Ответы
Ответ 1
Реальная разница в том, что @PreAuthorize
может работать с Spring Язык выражений (Spel). Вы можете:
- Способы доступа и свойства
SecurityExpressionRoot
.
-
Аргументы метода доступа (требуется компиляция с информацией об отладке или пользовательской ParameterNameDiscoverer
):
@PreAuthorize("#contact.name == principal.name")
public void doSomething(Contact contact)
- (Расширенная функция) Добавьте свои собственные методы (переопределите
MethodSecurityExpressionHandler
и установите его как <global-method-security><expression-handler ... /></...>
).
Ответ 2
Если вы хотите сделать что-то вроде доступа к методу, только если у пользователя есть Role1 и Role2, вам придется использовать @PreAuthorize.
@PreAuthorize("hasRole('ROLE_role1') and hasRole('ROLE_role2')")
С помощью
@Secured({"role1", "role2"}) // is treated as an OR
Ответ 3
Просто,
@PreAuthorize
новее, чем @Secured
.
Поэтому я говорю, что лучше использовать @PreAuthorize
, поскольку он "основан на выражении", и вы можете использовать выражения типа hasRole, hasAnyRole, allowAll и т.д.
Чтобы узнать о выражениях, см. эти выражения .
Ответ 4
@PreAuthorize
отличается, он более мощный, чем @Secured
.
Старые аннотации @Secured
не позволяли использовать выражения.
Начиная с Spring Security 3, более гибкие аннотации @PreAuthorize
и @PostAuthorize
(а также @PreFilter и @PostFilter) предпочтительнее, так как они поддерживают Spring Expression Язык (SpEL) и обеспечивает контроль доступа на основе выражений.
@Secured("ROLE_ADMIN")
аннотация аналогична @PreAuthorize ("hasRole('ROLE_ADMIN')")
.
The @Secured({"ROLE_USER","ROLE_ADMIN")
is considered as ROLE_USER OR ROLE_ADMIN.
поэтому вы не можете выразить условие AND с помощью
@Secured. Вы можете определить то же самое с @PreAuthorize("hasRole('ADMIN') OR hasRole('USER')")
, который легче понять. Вы также можете выразить И, ИЛИ или НЕ (!).
@PreAuthorize("!isAnonymous() AND hasRole( 'ADMIN')")
Ответ 5
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
| | @Secured | @PreAuthorize |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
| Spring EL expressions | Does'nt supports. | Supports |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
| Multiple roles conjunctions with AND operator | Does'nt supports.(If there are multiple roles defined | Supports |
| |they will be automatically combined with OR operator) | |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
| To enable annotation | Add following line to spring-security.xml | Add following line to spring-security.xml |
| | <global-method-security secured-annotations="enabled" /> | <global-method-security pre-post-annotations="enabled"/> |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
| Example | @Secured({ROLE_ADMIN , ROLE_USER}) | @PreAuthorize("hasRole('ROLE_USER') and hasRole('ROLE_ADMIN')") |
| | public void addUser(UserInfo user){...} | public void addUser(UserInfo user){...} |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+