Sự khác biệt giữa @Secured và @PreAuthorize trong bảo mật mùa xuân 3 là gì?


147

Tôi không rõ sự khác biệt trong bảo mật mùa xuân giữa:

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

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

Tôi hiểu PreAuthorize có thể hoạt động với spring el nhưng trong mẫu của tôi, có sự khác biệt thực sự không?

Câu trả lời:


169

Sự khác biệt thực sự là @PreAuthorizecó thể hoạt động với Ngôn ngữ biểu thức mùa xuân (SpEL) . Bạn có thể:

  • Phương thức truy cập và thuộc tính của SecurityExpressionRoot.
  • Đối số phương thức truy cập (yêu cầu biên dịch với thông tin gỡ lỗi hoặc tùy chỉnh ParameterNameDiscoverer):

    @PreAuthorize("#contact.name == principal.name")
    public void doSomething(Contact contact)
    
  • (Tính năng nâng cao) Thêm phương thức của riêng bạn (ghi đè MethodSecurityExpressionHandlervà đặt thành <global-method-security><expression-handler ... /></...>).

Không biết về điều này, nhưng có vẻ tuyệt vời! : D
Alfonso Nishikawa

52

Nếu bạn muốn làm một cái gì đó như truy cập phương thức chỉ khi người dùng có Vai trò 1 Vai trò 2 thì bạn sẽ phải sử dụng @PreAuthorize

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

Sử dụng

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

40

Đơn giản, @PreAuthorizemới hơn@Secured .

Vì vậy, tôi nói nó là tốt hơn để sử dụng @PreAuthorize vì nó là "dựa trên biểu thức" và bạn có thể sử dụng các biểu thức như hasRole, hasAnyRole, allowAll, v.v.

Để tìm hiểu về biểu thức, xem các biểu thức ví dụ này .


13

@PreAuthorizelà khác nhau, nó mạnh hơn @Secured.

  • Các @Securedchú thích cũ hơn không cho phép các biểu thức được sử dụng.

  • Bắt đầu với Spring Security 3, các chú thích linh hoạt hơn @PreAuthorize@PostAuthorize(cũng như @PreFilter và @PostFilter) được ưu tiên, vì chúng hỗ trợ Spring Expression Language (SpEL) và cung cấp kiểm soát truy cập dựa trên biểu thức.

  • @Secured("ROLE_ADMIN")chú thích giống như @PreAuthorize ("hasRole('ROLE_ADMIN')").

  • Cái @Secured({"ROLE_USER","ROLE_ADMIN")này được coi là ROLE_USER HOẶC ROLE_ADMIN.

vì vậy bạn không thể biểu thị điều kiện AND bằng cách sử dụng

@ Bảo đảm . Bạn có thể định nghĩa tương tự với @PreAuthorize("hasRole('ADMIN') OR hasRole('USER')"), dễ hiểu hơn. Bạn cũng có thể diễn đạt VÀ, HOẶC hoặc KHÔNG (!) .

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


1
Khi bạn hoàn nguyên bản chỉnh sửa của mình, bạn có nói rằng không có lỗi trong việc này "hasRole('ADMIN OR hasRole('USER')"không?
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){...}                         |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.