Какая разница между @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){...}                         |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+