Bahar güvenliği 3'te @Secured ve @PreAuthorize arasındaki fark nedir?


151

Bahar güvenliğindeki aşağıdakiler arasındaki farkın ne olduğu benim için net değil:

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

Ve

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

PreAuthorize'ın spring el ile çalışabileceğini anlıyorum ama benim örneğimde gerçek bir fark var mı?

Yanıtlar:


170

Gerçek fark, Spring Expression Language (SpEL)@PreAuthorize ile çalışabilmesidir . Yapabilirsin:

  • Erişim yöntemlerine ve özelliklerine SecurityExpressionRoot.
  • Erişim yöntemi bağımsız değişkenleri (hata ayıklama bilgileriyle veya özel olarak derleme gerektirir ParameterNameDiscoverer):

    @PreAuthorize("#contact.name == principal.name")
    public void doSomething(Contact contact)
    
  • (Gelişmiş özellik) Kendi yöntemlerinizi ekleyin (geçersiz kılın MethodSecurityExpressionHandlerve olarak ayarlayın <global-method-security><expression-handler ... /></...>).

Bunu bilmiyordum ama harika görünüyor! : D
Alfonso Nishikawa

52

Yönteme sadece kullanıcı Rol1 ve Rol2'ye sahipse erişmek gibi bir şey yapmak istiyorsanız, @ PreAuthorize kullanmanız gerekir.

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

Kullanma

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

40

Basitçe, @PreAuthorizedaha yenidir @Secured.

Bu yüzden @PreAuthorize"ifade tabanlı" olduğu için kullanmanın daha iyi olduğunu ve hasRole, hasAnyRole, permitAll gibi ifadeleri kullanabileceğinizi söylüyorum.

İfadeler hakkında bilgi edinmek için bu örnek ifadelere bakın .


13

@PreAuthorizefarklıdır, daha güçlüdür @Secured.

  • Daha eski @Securedaçıklamalar, ifadelerin kullanılmasına izin vermiyordu.

  • Spring Security 3'ten başlayarak, Spring Expression Language'i (SpEL) destekledikleri ve ifade tabanlı erişim kontrolü sağladıkları için daha esnek açıklamalar @PreAuthorizeve @PostAuthorize(ayrıca @PreFilter ve @PostFilter) tercih edilir.

  • @Secured("ROLE_ADMIN")ek açıklama ile aynıdır @PreAuthorize ("hasRole('ROLE_ADMIN')").

  • @Secured({"ROLE_USER","ROLE_ADMIN")ROLE_USER olarak kabul edilir VEYA ROLE_ADMIN.

bu yüzden AND koşulunu kullanarak ifade edemezsiniz

@ Güvenli . Aynı şeyi ile tanımlayabilirsiniz @PreAuthorize("hasRole('ADMIN') OR hasRole('USER')"), ki bu anlaşılması daha kolaydır. VE, VEYA veya DEĞİL (!) De ifade edebilirsiniz .

@PreAuthorize ("! İsAnonymous () AND hasRole ('ADMIN')")


1
Düzenlememi geri aldığınızda, bunda bir hata olmadığını mı söylüyorsunuz "hasRole('ADMIN OR hasRole('USER')"?
rigon

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){...}                         |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.