Hầu hết các câu trả lời đều thiếu một số điểm:
Vai trò và quyền hạn không giống nhau trong mùa xuân. Xem ở đây để biết thêm chi tiết.
Tên vai trò bằng rolePrefix
+ authority
.
Tiền tố vai trò mặc định là ROLE_
, tuy nhiên, nó có thể cấu hình. Xem ở đây .
Do đó, kiểm tra vai trò thích hợp cần phải tôn trọng tiền tố vai trò nếu nó được cấu hình.
Thật không may, tùy chỉnh tiền tố vai trò trong Spring là một chút hack, ở nhiều nơi, tiền tố mặc định, ROLE_
được mã hóa cứng, nhưng ngoài ra, một loại đậuGrantedAuthorityDefaults
được kiểm tra trong ngữ cảnh Spring và nếu nó tồn tại, thì tiền tố vai trò tùy chỉnh đã được tôn trọng.
Mang tất cả thông tin này lại với nhau, việc thực hiện kiểm tra vai trò tốt hơn sẽ giống như:
@Component
public class RoleChecker {
@Autowired(required = false)
private GrantedAuthorityDefaults grantedAuthorityDefaults;
public boolean hasRole(String role) {
String rolePrefix = grantedAuthorityDefaults != null ? grantedAuthorityDefaults.getRolePrefix() : "ROLE_";
return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication())
.map(Authentication::getAuthorities)
.map(Collection::stream)
.orElse(Stream.empty())
.map(GrantedAuthority::getAuthority)
.map(authority -> rolePrefix + authority)
.anyMatch(role::equals);
}
}
SecurityContextHolderAwareRequestWrapper
thể hiện. Bạn có thể cải thiện nó giải thích làm thế nào để có được nó và làm rõ câu trả lời hơn một chút.