คิดว่าเป็นสิ่งที่ได้รับอนุญาตให้เป็น "สิทธิ์" หรือ "สิทธิ" "สิทธิ์" เหล่านั้น (ปกติ) แสดงเป็นสตริง (พร้อมกับ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 ที่ส่งคืน