ความแตกต่างระหว่าง @Secured และ @PreAuthorize ในการรักษาความปลอดภัยสปริง 3 คืออะไร


147

ยังไม่ชัดเจนสำหรับฉันความแตกต่างของความปลอดภัยของสปริงระหว่าง:

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

และ

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

ฉันเข้าใจว่า PreAuthorize สามารถทำงานกับสปริง el ได้ แต่ในตัวอย่างของฉันมีความแตกต่างจริงหรือไม่?

คำตอบ:


169

แตกต่างที่แท้จริงคือการที่@PreAuthorizeสามารถทำงานกับฤดูใบไม้ผลิการแสดงออกภาษา (เกม) คุณสามารถ:

  • SecurityExpressionRootวิธีการเข้าถึงและคุณสมบัติของ
  • อาร์กิวเมนต์วิธีการเข้าถึง (ต้องมีการรวบรวมข้อมูล debug หรือกำหนดเองParameterNameDiscoverer):

    @PreAuthorize("#contact.name == principal.name")
    public void doSomething(Contact contact)
    
  • (คุณสมบัติขั้นสูง) เพิ่มวิธีการของคุณเอง (แทนที่MethodSecurityExpressionHandlerและตั้งค่าเป็น<global-method-security><expression-handler ... /></...>)

ไม่ทราบเกี่ยวกับสิ่งนี้ แต่ดูเหมือนยอดเยี่ยม! : D
Alfonso Nishikawa

52

หากคุณต้องการทำบางอย่างเช่นการเข้าถึงวิธีการเฉพาะเมื่อผู้ใช้มี Role1 และ Role2 ดังนั้นคุณจะต้องใช้ @PreAuthorize

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

การใช้

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

40

เพียงแค่ เป็นรุ่นใหม่กว่า@PreAuthorize@Secured

ดังนั้นฉันจึงบอกว่ามันจะดีกว่าที่จะใช้@PreAuthorizeเพราะมันเป็น "expression-based" และคุณสามารถใช้นิพจน์เช่น hasRole, hasAnyRole, licenseAll ฯลฯ

เรียนรู้เกี่ยวกับสำนวนเห็นเหล่านี้แสดงออกตัวอย่างเช่น


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

ดังนั้นคุณไม่สามารถแสดงเงื่อนไขและการใช้

@ปลอดภัย คุณสามารถกำหนดสิ่งเดียวกันด้วย@PreAuthorize("hasRole('ADMIN') OR hasRole('USER')")ซึ่งง่ายต่อการเข้าใจ คุณสามารถแสดงและ, หรือ, หรือไม่ (!)เช่นกัน

@PreAuthorize ("! isAnonymous () และ hasRole ('ADMIN')")


1
ในขณะที่คุณหวนกลับไปแก้ไขของฉันที่คุณบอกว่าไม่มีข้อผิดพลาดในเรื่องนี้"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){...}                         |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.