Bagaimana cara memeriksa otoritas atau izin pengguna di Kode Java? Misalnya - Saya ingin menampilkan atau menyembunyikan tombol untuk pengguna tergantung pada peran. Ada anotasi seperti:
@PreAuthorize("hasRole('ROLE_USER')")
Bagaimana cara membuatnya dalam kode Java? Sesuatu seperti :
if(somethingHere.hasRole("ROLE_MANAGER")) {
layout.addComponent(new Button("Edit users"));
}
java
spring-security
user-roles
Piotr Gwiazda
sumber
sumber
SecurityContextHolderAwareRequestWrapper
contoh. Anda dapat memperbaikinya dengan menjelaskan cara mendapatkannya dan mengklarifikasi jawaban itu sendiri sedikit lebih banyak.Anda dapat menggunakan metode isUserInRole dari objek HttpServletRequest.
sesuatu seperti:
sumber
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest()
untuk mendapatkan permintaan tersebut? :)Alih-alih menggunakan loop untuk menemukan otoritas dari UserDetails, Anda dapat melakukan:
sumber
Anda dapat mengambil konteks keamanan dan kemudian menggunakannya:
sumber
SecurityContextHolder.getContext()
tidak pernahNULL
, periksa dokumennya. Dengan demikian Anda dapat menghindari memeriksa keberadaan konteksNULL
.Anda dapat menerapkan metode hasRole () seperti di bawah ini - (Ini diuji pada keamanan pegas 3.0.x tidak yakin tentang versi lain.)
sumber
SecurityContextHolder.getContext().getAuthentication()
dapat mengambilnull
. Mungkin Anda menambahkan beberapa cek?Saya menggunakan ini:
sumber
Anda bisa mendapatkan bantuan dari kelas AuthorityUtils . Memeriksa peran sebagai satu baris:
Peringatan: Ini tidak memeriksa hierarki peran, jika ada.
sumber
Jawaban dari JoseK tidak dapat digunakan saat Anda berada di lapisan layanan Anda, di mana Anda tidak ingin memperkenalkan penggabungan dengan lapisan web dari referensi ke permintaan HTTP. Jika Anda ingin menyelesaikan peran saat berada di lapisan layanan, jawaban Gopi adalah cara yang tepat.
Namun, itu agak bertele-tele. Otoritas dapat diakses langsung dari Otentikasi. Oleh karena itu, jika Anda dapat berasumsi bahwa Anda memiliki pengguna yang masuk, berikut ini yang melakukannya:
sumber
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:
sumber
Anehnya, saya rasa tidak ada solusi standar untuk masalah ini, karena kontrol akses keamanan pegas berbasis ekspresi , bukan berbasis java. Anda dapat memeriksa kode sumber untuk DefaultMethodSecurityExpressionHandler untuk melihat apakah Anda dapat menggunakan kembali sesuatu yang mereka lakukan di sana
sumber
Lebih baik terlambat daripada tidak pernah, biarkan saya memasukkan nilai 2 sen saya.
Di dunia JSF, di dalam kacang yang saya kelola, saya melakukan hal berikut:
Seperti disebutkan di atas, pemahaman saya adalah bahwa hal itu dapat dilakukan dengan cara yang bertele-tele sebagai berikut:
sumber
Ini seperti datang pada pertanyaan dari ujung lain tetapi saya pikir saya akan melemparkannya karena saya benar-benar harus menggali di internet untuk menemukan ini.
Ada banyak hal tentang cara memeriksa peran tetapi tidak banyak mengatakan apa yang sebenarnya Anda periksa ketika Anda mengatakan hasRole ("bla")
HasRole memeriksa otoritas yang diberikan untuk kepala sekolah yang saat ini diautentikasi
Jadi sungguh ketika Anda melihat hasRole ("blah") yang sebenarnya berarti hasAuthority ("blah") .
Dalam kasus yang pernah saya lihat, Anda melakukan ini dengan kelas yang Mengimplementasikan UserDetails yang mendefinisikan metode yang disebut getAuthorities. Dalam hal ini Anda pada dasarnya akan menambahkan beberapa
new SimpleGrantedAuthority("some name")
ke daftar berdasarkan beberapa logika. Nama-nama dalam daftar ini adalah hal-hal yang diperiksa oleh pernyataan hasRole.Saya kira dalam konteks ini objek UserDetails adalah kepala sekolah yang saat ini diautentikasi. Ada beberapa keajaiban yang terjadi di dalam dan di sekitar penyedia otentikasi dan lebih khusus lagi manajer otentikasi yang membuat ini terjadi.
sumber
hasRole("bla")
sekarang sama denganhasAuthority("ROLE_bla")
.Jawaban @gouki adalah yang terbaik!
Hanya tip bagaimana musim semi benar-benar melakukan ini.
Ada sebuah kelas bernama
SecurityContextHolderAwareRequestWrapper
yang mengimplementasikanServletRequestWrapper
kelas tersebut.The
SecurityContextHolderAwareRequestWrapper
menimpa paraisUserInRole
dan pencarian penggunaAuthentication
(yang dikelola oleh musim semi) untuk menemukan jika pengguna memiliki peran atau tidak.SecurityContextHolderAwareRequestWrapper
kodenya adalah sebagai:sumber
Kedua anotasi di bawah ini sama, "hasRole" akan otomatis menambahkan awalan "ROLE_". Pastikan Anda memiliki anotasi yang benar. Peran ini disetel di UserDetailsService # loadUserByUsername.
kemudian, Anda bisa mendapatkan peran dalam kode java.
sumber
Dalam proyek kami, kami menggunakan hierarki peran, sementara sebagian besar jawaban di atas hanya bertujuan untuk memeriksa peran tertentu, yaitu hanya akan memeriksa peran yang diberikan, tetapi tidak untuk peran tersebut dan hierarki atas.
Solusi untuk ini:
RoleHierarchy didefinisikan sebagai kacang di spring-security.xml.
sumber
Pada model pengguna Anda cukup tambahkan metode 'hasRole' seperti di bawah ini
Saya biasanya menggunakannya untuk memeriksa apakah pengguna yang diautentikasi memiliki peran admin sebagai berikut
sumber
Peran Pengguna dapat diperiksa dengan cara berikut:
Menggunakan metode statis panggilan di SecurityContextHolder:
Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null && auth.getAuthorities().stream().anyMatch(role -> role.getAuthority().equals("ROLE_NAME"))) { //do something}
Menggunakan HttpServletRequest
sumber
Pendekatan Saya dengan bantuan Java8, Melewati peran yang dipisahkan koma akan memberi Anda benar atau salah
sumber