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);
}
}
SecurityContextHolderAwareRequestWrapper
contoh. Anda dapat memperbaikinya dengan menjelaskan cara mendapatkannya dan mengklarifikasi jawaban itu sendiri sedikit lebih banyak.