คิดว่าเป็นสิ่งที่ได้รับอนุญาตให้เป็น "สิทธิ์" หรือ "สิทธิ" "สิทธิ์" เหล่านั้น (ปกติ) แสดงเป็นสตริง (พร้อมกับgetAuthority()
วิธีการ) สตริงเหล่านั้นให้คุณระบุสิทธิ์และให้ผู้ลงคะแนนตัดสินใจว่าจะอนุญาตให้เข้าถึงบางสิ่งหรือไม่
คุณสามารถให้สิทธิ์ผู้ใช้ GrantedAuthoritys (การอนุญาต) ที่แตกต่างกันโดยวางลงในบริบทความปลอดภัย โดยปกติแล้วคุณทำได้โดยการใช้ UserDetailsService ของคุณเองซึ่งส่งคืนการปรับใช้ UserDetails ที่ส่งกลับ GrantedAuthorities ที่จำเป็น
บทบาท (ที่พวกเขาจะนำมาใช้ในหลายตัวอย่าง) เป็นเพียง "สิทธิ์" ที่มีการตั้งชื่อที่บอกว่าบทบาทเป็น GrantedAuthority ROLE_
ที่เริ่มต้นด้วยคำนำหน้า ไม่มีอะไรเพิ่มเติม บทบาทเป็นเพียงสิ่งที่ได้รับสิทธิ์ - "สิทธิ์" - "ถูกต้อง" คุณเห็นสถานที่จำนวนมากในการรักษาความปลอดภัยสปริงที่มีการROLE_
จัดการบทบาทพร้อมคำนำหน้าเป็นพิเศษเช่นใน RoleVoter ซึ่งROLE_
มีการใช้คำนำหน้าเป็นค่าเริ่มต้น สิ่งนี้อนุญาตให้คุณระบุชื่อบทบาทโดยไม่ใช้ROLE_
คำนำหน้า ก่อนการรักษาความปลอดภัยของสปริง 4 การจัดการ "บทบาท" นี้ไม่ได้รับการปฏิบัติอย่างสม่ำเสมอและเจ้าหน้าที่และบทบาทมักได้รับการปฏิบัติเช่นเดียวกัน (เช่นคุณเช่นhasAuthority()
hasRole()
) ด้วย Spring Security 4 การปฏิบัติหน้าที่มีความสอดคล้องกันมากขึ้นและรหัสที่เกี่ยวข้องกับ "บทบาท" (เช่นRoleVoter
, การhasRole
แสดงออก ฯลฯ ) จะเพิ่มROLE_
คำนำหน้าให้คุณเสมอ ดังนั้นhasAuthority('ROLE_ADMIN')
หมายถึงเช่นเดียวกับhasRole('ADMIN')
เพราะROLE_
คำนำหน้าจะถูกเพิ่มโดยอัตโนมัติ ดูคู่มือการโยกย้ายความปลอดภัยสปริง 3 ถึง 4 สำหรับข้อมูลเพิ่มเติม
แต่ก็ยัง: บทบาทเป็นเพียงผู้มีอำนาจด้วยROLE_
คำนำหน้าพิเศษ ดังนั้นในฤดูใบไม้ผลิการรักษาความปลอดภัย 3 @PreAuthorize("hasRole('ROLE_XYZ')")
เป็นเช่นเดียวกับ@PreAuthorize("hasAuthority('ROLE_XYZ')")
ในฤดูใบไม้ผลิการรักษาความปลอดภัย 4 เป็นเช่นเดียวกับ@PreAuthorize("hasRole('XYZ')")
@PreAuthorize("hasAuthority('ROLE_XYZ')")
เกี่ยวกับกรณีการใช้งานของคุณ:
ผู้ใช้มีบทบาทและบทบาทสามารถดำเนินการบางอย่างได้
คุณสามารถจบลงGrantedAuthorities
ด้วยบทบาทที่ผู้ใช้เป็นเจ้าของและการดำเนินการที่บทบาทสามารถทำได้ GrantedAuthorities
สำหรับบทบาทมีคำนำหน้าและการดำเนินงานมีคำนำหน้าROLE_
OP_
ตัวอย่างสำหรับหน่วยงานการดำเนินการอาจจะOP_DELETE_ACCOUNT
, OP_CREATE_USER
, OP_RUN_BATCH_JOB
ฯลฯ บทบาทสามารถROLE_ADMIN
, ROLE_USER
,ROLE_OWNER
ฯลฯ
คุณสามารถท้ายที่สุดให้เอนทิตีของคุณติดตั้งใช้งานได้GrantedAuthority
ในตัวอย่างนี้ (รหัสเทียม):
@Entity
class Role implements GrantedAuthority {
@Id
private String id;
@ManyToMany
private final List<Operation> allowedOperations = new ArrayList<>();
@Override
public String getAuthority() {
return id;
}
public Collection<GrantedAuthority> getAllowedOperations() {
return allowedOperations;
}
}
@Entity
class User {
@Id
private String id;
@ManyToMany
private final List<Role> roles = new ArrayList<>();
public Collection<Role> getRoles() {
return roles;
}
}
@Entity
class Operation implements GrantedAuthority {
@Id
private String id;
@Override
public String getAuthority() {
return id;
}
}
รหัสของบทบาทและการดำเนินงานที่คุณสร้างในฐานข้อมูลของคุณจะเป็นตัวแทน GrantedAuthority เช่นROLE_ADMIN
,OP_DELETE_ACCOUNT
ฯลฯ เมื่อผู้ใช้รับรองความถูกต้องให้แน่ใจว่า GrantedAuthorities ทั้งหมดของทุกบทบาทและการดำเนินงานที่สอดคล้องกันจะถูกส่งกลับจาก UserDetails.getAuthorities (ที่) วิธี.
ตัวอย่าง: บทบาทผู้ดูแลระบบที่มี ID ROLE_ADMIN
มีการดำเนินงานOP_DELETE_ACCOUNT
, OP_READ_ACCOUNT
, OP_RUN_BATCH_JOB
กำหนดให้มัน บทบาทผู้ใช้ที่มี id ROLE_USER
มีการดำเนินการOP_READ_ACCOUNT
มีการดำเนินการ
หากมีการบันทึกผู้ดูแลระบบในบริบทความปลอดภัยที่เกิดขึ้นจะมี GrantedAuthorities นี้:
ROLE_ADMIN
, OP_DELETE_ACCOUNT
, OP_READ_ACCOUNT
,OP_RUN_BATCH_JOB
หากผู้ใช้บันทึกมันจะมี:
ROLE_USER
,OP_READ_ACCOUNT
UserDetailsService จะดูแลการรวบรวมบทบาททั้งหมดและการดำเนินการทั้งหมดของบทบาทเหล่านั้นและทำให้พร้อมใช้งานโดยเมธอด getAuthorities () ในอินสแตนซ์ UserDetails ที่ส่งคืน