Otoritas yang Diberikan versus Peran dalam Keamanan Musim Semi

1. Ikhtisar

Dalam artikel singkat ini, kami akan menjelaskan perbedaan halus namun signifikan antara Role dan GrantedAuthority dalam Keamanan Musim Semi . Untuk informasi lebih rinci tentang peran dan otoritas, lihat artikel di sini.

2. GrantedAuthority

Di Keamanan Musim Semi, kita dapat menganggap setiap GrantedAuthority sebagai hak istimewa individu . Contohnya dapat mencakup READ_AUTHORITY , WRITE_PRIVILEGE , atau bahkan CAN_EXECUTE_AS_ROOT . Hal penting yang harus dipahami adalah bahwa nama itu sewenang-wenang .

Saat menggunakan GrantedAuthority secara langsung, seperti melalui penggunaan ekspresi seperti hasAuthority ('READ_AUTHORITY'), kami membatasi akses dengan cara yang sangat detail .

Seperti yang mungkin bisa Anda kumpulkan, kita bisa merujuk pada konsep otoritas dengan menggunakan hak istimewa juga.

3. Berperan sebagai Otoritas

Demikian pula, di Keamanan Musim Semi, kita dapat menganggap setiap Peran sebagai GrantedAuthority berbutir kasar yang direpresentasikan sebagai String dan diawali dengan " ROLE " . Saat menggunakan Peran secara langsung, seperti melalui ekspresi seperti hasRole ("ADMIN") , kami membatasi akses dengan cara yang sangat kasar.

Perlu dicatat bahwa awalan "ROLE " default dapat dikonfigurasi, tetapi menjelaskan cara melakukannya berada di luar cakupan artikel ini.

Perbedaan inti antara keduanya adalah semantik yang kami lampirkan pada cara kami menggunakan fitur tersebut. Untuk kerangka kerja, perbedaannya minimal - dan pada dasarnya berkaitan dengan hal ini dengan cara yang persis sama.

4. Berperan sebagai Wadah

Sekarang kita telah melihat bagaimana kerangka kerja menggunakan konsep peran , mari kita juga dengan cepat membahas alternatif - dan itu menggunakan peran sebagai wadah otoritas / hak istimewa .

Ini adalah pendekatan tingkat yang lebih tinggi untuk peran - menjadikannya konsep yang lebih menghadap bisnis daripada yang berpusat pada implementasi.

Framework Keamanan Musim Semi tidak memberikan panduan apa pun dalam hal bagaimana kita harus menggunakan konsep tersebut, jadi pilihannya sepenuhnya spesifik untuk implementasi.

5. Konfigurasi Keamanan Musim Semi

Kami dapat mendemonstrasikan persyaratan otorisasi yang sangat rinci dengan membatasi akses ke / protectedbyauthority untuk pengguna dengan READ_AUTHORITY .

Kami dapat mendemonstrasikan persyaratan otorisasi yang sangat terperinci dengan membatasi akses ke / protectedbyrole untuk pengguna dengan ROLE_USER .

Mari kita konfigurasikan skenario seperti itu dalam konfigurasi keamanan kita:

@Override protected void configure(HttpSecurity http) throws Exception { // ... .antMatchers("/protectedbyrole").hasRole("USER") .antMatchers("/protectedbyauthority").hasAuthority("READ_PRIVILEGE") // ... }

6. Init Data Sederhana

Sekarang setelah kita memahami konsep inti dengan lebih baik, mari kita bicara tentang membuat beberapa data penyiapan saat aplikasi dijalankan.

Ini, tentu saja, adalah cara yang sangat sederhana untuk melakukannya, untuk mulai bekerja dengan beberapa pengguna uji coba awal selama pengembangan - bukan cara Anda menangani data dalam produksi.

Kami akan mendengarkan acara penyegaran konteks:

@Override @Transactional public void onApplicationEvent(ContextRefreshedEvent event) { MyPrivilege readPrivilege = createPrivilegeIfNotFound("READ_PRIVILEGE"); MyPrivilege writePrivilege = createPrivilegeIfNotFound("WRITE_PRIVILEGE"); }

Penerapan sebenarnya di sini tidak terlalu penting - dan umumnya, bergantung pada solusi ketekunan yang Anda gunakan. Poin utamanya adalah - kami mempertahankan otoritas yang kami gunakan dalam kode.

7. UserDetailsService

Implementasi UserDetailsService kami adalah tempat pemetaan otoritas dilakukan . Setelah pengguna mengautentikasi, metode getAuthorities () kami mengisi dan mengembalikan objek UserDetails :

private Collection getAuthorities( Collection roles) { List authorities = new ArrayList(); for (Role role: roles) { authorities.add(new SimpleGrantedAuthority(role.getName())); role.getPrivileges().stream() .map(p -> new SimpleGrantedAuthority(p.getName())) .forEach(authorities::add); } return authorities; }

8. Menjalankan dan Menguji Contoh

Kita dapat menjalankan contoh aplikasi Java RolesAuthoritiesApplication , yang ditemukan di proyek GitHub.

Untuk melihat otorisasi berbasis peran beraksi, kita perlu:

  • Akses // localhost: 8082 / protectedbyrole
  • Autentikasi sebagai [dilindungi email] (sandi adalah "pengguna" )
  • Perhatikan otorisasi yang berhasil
  • Akses // localhost: 8082 / protectedbyauthority
  • Catat otorisasi yang tidak berhasil

Untuk melihat otorisasi berbasis otoritas dalam tindakan, kita perlu keluar dari aplikasi dan kemudian:

  • Akses // localhost: 8082 / protectedbyauthority
  • Otentikasi sebagai [dilindungi email] / admin
  • Perhatikan otorisasi yang berhasil
  • Akses // localhsot: 8082 / protectedbyrole
  • Catat otorisasi yang tidak berhasil

9. Kesimpulan

Dalam tutorial singkat ini, kita melihat perbedaan halus namun signifikan antara Role dan GrantedAuthority dalam Keamanan Musim Semi.