Яка різниця між @Secured та @PreAuthorize у весняній безпеці 3?


147

Незрозуміло для мене, в чому різниця у весняній безпеці між:

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

І

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

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

Відповіді:


169

Справжня різниця полягає в тому, що @PreAuthorizeможна працювати з Spring Expression Language (SpEL) . Ти можеш:

  • Методи доступу та властивості SecurityExpressionRoot.
  • Аргументи методу доступу (вимагає компіляції з інформацією про налагодження або користувальницькою ParameterNameDiscoverer):

    @PreAuthorize("#contact.name == principal.name")
    public void doSomething(Contact contact)
    
  • (Додаткова функція) Додайте власні методи (замініть MethodSecurityExpressionHandlerі встановіть це як <global-method-security><expression-handler ... /></...>).

Не знав про це, але здається дивним! : D
Альфонсо Нішікава

52

Якщо ви хочете зробити щось на кшталт доступу до методу, лише якщо у користувача є Role1 та Role2, тоді вам доведеться використовувати @PreAuthorize

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

Використання

@Secured({"role1", "role2"}) // is treated as an OR

40

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

Тому я кажу, що краще використовувати так, @PreAuthorizeяк він "заснований на виразі", і ви можете використовувати такі вирази, як hasRole, hasAnyRole, дазвол та ін.

Щоб дізнатися про вирази, див. Ці приклади виразів .


13

@PreAuthorizeінший, він більш потужний, ніж @Secured.

  • Старіші @Securedпримітки не дозволяли використовувати вирази.

  • Починаючи з Spring Security 3, переважніші гнучкіші примітки @PreAuthorizeта @PostAuthorize(а також @PreFilter та @PostFilter), оскільки вони підтримують Spring Expression Language (SpEL) та забезпечують контроль доступу на основі виразів.

  • @Secured("ROLE_ADMIN")анотація те саме, що @PreAuthorize ("hasRole('ROLE_ADMIN')").

  • @Secured({"ROLE_USER","ROLE_ADMIN")Розглядається як ROLE_USER АБО ROLE_ADMIN.

тому ви не можете виразити умову AND за допомогою

@ Виконаний . Ви можете визначити те саме @PreAuthorize("hasRole('ADMIN') OR hasRole('USER')"), що легше зрозуміти. Ви можете також виразити AND, OR або NOT (!) .

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


1
Коли ви скасували мою редакцію, чи говорите ви, що в цьому немає помилок "hasRole('ADMIN OR hasRole('USER')"?
ригон

8
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
|                                               |                         @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){...}                         |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.