В чем разница между @Secured и @PreAuthorize в весенней безопасности 3? - PullRequest
130 голосов
/ 24 сентября 2010

Мне не ясно, в чем разница между безопасностью пружины между:

 @PreAuthorize("hasRole('ROLE_USER')")
 public void create(Contact contact)

И

@Secured("ROLE_USER")
public void create(Contact contact)

Я понимаю, что PreAuthorize может работать с пружиной el, но в моем примереесть ли реальная разница?

Ответы [ 5 ]

153 голосов
/ 24 сентября 2010

Реальная разница в том, что @PreAuthorize может работать с Spring Expression Language (SpEL) . Вы можете:

  • Доступ к методам и свойствам SecurityExpressionRoot.
  • Доступ к аргументам метода (требуется компиляция с отладочной информацией или пользовательский ParameterNameDiscoverer):

    @PreAuthorize("#contact.name == principal.name")
    public void doSomething(Contact contact)
    
  • (расширенная функция) Добавьте свои собственные методы (переопределите MethodSecurityExpressionHandler и установите его как <global-method-security><expression-handler ... /></...>).
44 голосов
/ 19 декабря 2012

Если вы хотите сделать что-то вроде доступа к методу, только если у пользователя есть Role1 и Role2, вам придется использовать @ PreAuthorize

@PreAuthorize("hasRole('ROLE_role1') and hasRole('ROLE_role2')")

Using

@Secured({"role1", "role2"}) // is treated as an OR
35 голосов
/ 06 марта 2012

Просто, @PreAuthorize новее @Secured.

Так что я говорю, что лучше использовать @PreAuthorize, поскольку он «основан на выражениях», и вы можете использовать такие выражения, как hasRole, hasAnyRole, allowAll и т. Д.

Чтобы узнать о выражениях, посмотрите эти примеры выражений .

8 голосов
/ 03 октября 2017

@PreAuthorize отличается, он более мощный, чем @Secured.

  • Старые аннотации @Secured не позволяли использовать выражения.

  • Начиная с Spring Security 3, более гибкие аннотации @PreAuthorize и @PostAuthorize (а также @PreFilter и @PostFilter) предпочтительнее, так как они поддерживают Spring Expression Язык (SpEL) и обеспечивает контроль доступа на основе выражений.

  • @Secured("ROLE_ADMIN") аннотация такая же, как @PreAuthorize ("hasRole('ROLE_ADMIN')").

  • @Secured({"ROLE_USER","ROLE_ADMIN") рассматривается как ROLE_USER ИЛИ ROLE_ADMIN.

    1036 **

, поэтому вы не можете выразить условие AND с помощью

@ Обеспеченные . Вы можете определить то же самое с @PreAuthorize("hasRole('ADMIN OR hasRole('USER')"), который легче Понимаю. Вы также можете выразить И, ИЛИ или НЕ (!) .

@ PreAuthorize ("! IsAnonymous () И hasRole ('ADMIN')")

3 голосов
/ 21 мая 2018
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
|                                               |                         @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){...}                         |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...