Sebagian besar jawaban kehilangan beberapa poin:
Peran dan otoritas bukanlah hal yang sama di Spring. Lihat di sini untuk lebih lanjut jelasnya.
Nama peran sama dengan rolePrefix+authority .
ROLE_Namun, awalan peran default dapat dikonfigurasi. Lihat disini .
Oleh karena itu, pemeriksaan peran yang tepat perlu menghormati prefiks peran jika dikonfigurasi.
Sayangnya, kustomisasi peran prefiks di Spring agak hacky, di banyak tempat prefiks default, di ROLE_-hardcode, tetapi selain itu, sejenis kacangGrantedAuthorityDefaults diperiksa dalam konteks Spring, dan jika ada, peran kustom prefiks itu telah dihormati.
Dengan menggabungkan semua informasi ini, implementasi pemeriksa peran yang lebih baik akan menjadi seperti ini:
@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);
}
}
SecurityContextHolderAwareRequestWrappercontoh. Anda dapat memperbaikinya dengan menjelaskan cara mendapatkannya dan mengklarifikasi jawaban itu sendiri sedikit lebih banyak.