Pemberian Kuasa Versus Peranan dalam Keselamatan Musim Semi

1. Gambaran keseluruhan

Dalam artikel ringkas ini, kami akan menerangkan perbezaan yang halus tetapi ketara antara Peranan dan GrantedAuthority dalam Spring Security . Untuk maklumat yang lebih terperinci mengenai peranan dan pihak berkuasa, lihat artikel di sini.

2. GrantAuthority

Di Spring Security, kita dapat menganggap setiap GrantedAuthority sebagai hak istimewa individu . Contohnya termasuk READ_AUTHORITY , WRITE_PRIVILEGE , atau bahkan CAN_EXECUTE_AS_ROOT . Perkara penting untuk difahami ialah nama itu sewenang-wenangnya .

Semasa menggunakan GrantedAuthority secara langsung, seperti melalui penggunaan ungkapan seperti hasAuthority ('READ_AUTHORITY'), kami menyekat akses secara halus .

Seperti yang mungkin anda kumpulkan, kita dapat merujuk konsep kewibawaan dengan menggunakan hak istimewa juga.

3. Peranan sebagai Kuasa

Begitu juga, di Spring Security, kita dapat menganggap setiap Peran sebagai GrantedAuthority kasar yang dilambangkan sebagai String dan diawali dengan " ROLE " . Apabila menggunakan Peranan secara langsung, seperti melalui ekspresi seperti hasRole ("ADMIN") , kami menyekat akses secara kasar.

Perlu diperhatikan bahawa awalan "ROLE " lalai dapat dikonfigurasi, tetapi menjelaskan cara melakukannya adalah di luar ruang lingkup artikel ini.

Perbezaan inti antara keduanya adalah semantik yang kita lampirkan pada bagaimana kita menggunakan ciri tersebut. Untuk kerangka kerja, perbezaannya minimum - dan pada dasarnya membincangkannya dengan cara yang sama.

4. Peranan sebagai Bekas

Sekarang setelah kita melihat bagaimana kerangka menggunakan konsep peranan , mari kita bincangkan alternatif dengan cepat - dan itu menggunakan peranan sebagai wadah pihak berkuasa / hak istimewa .

Ini adalah pendekatan yang lebih tinggi untuk peranan - menjadikannya konsep yang lebih berhadapan dengan perniagaan daripada konsep yang berpusat pada pelaksanaan.

Kerangka Keselamatan Musim Semi tidak memberikan panduan mengenai bagaimana kita harus menggunakan konsep tersebut, jadi pilihannya sepenuhnya khusus untuk pelaksanaannya.

5. Konfigurasi Keselamatan Musim Semi

Kami dapat menunjukkan syarat kebenaran yang terperinci dengan menyekat akses ke / dilindungi hak milik kepada pengguna dengan READ_AUTHORITY .

Kami dapat menunjukkan syarat kebenaran yang kasar dengan menyekat akses ke / dilindungi oleh pengguna dengan pengguna dengan ROLE_USER .

Mari konfigurasikan senario sedemikian dalam konfigurasi keselamatan kami:

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

6. Init Data Ringkas

Sekarang setelah kita memahami konsep teras dengan lebih baik, mari kita bincangkan tentang membuat beberapa data persediaan ketika aplikasi dimulakan.

Sudah tentu ini adalah cara yang sangat mudah untuk melakukannya, dengan berjalan dengan beberapa pengguna ujian awal semasa pembangunan - bukan cara anda harus mengendalikan data dalam pengeluaran.

Kami akan mendengar acara penyegaran konteks:

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

Pelaksanaan sebenarnya di sini tidak begitu penting - dan secara amnya, bergantung pada penyelesaian ketekunan yang anda gunakan. Perkara utama adalah - kami masih meneruskan pihak berkuasa yang kami gunakan dalam kod.

7. Perkhidmatan PenggunaDetail

Pelaksanaan kami UserDetailsService adalah tempat pemetaan otoritas berlangsung . Setelah pengguna mengesahkan, kaedah 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. Berlari dan Menguji Contohnya

Kita dapat menjalankan contoh aplikasi Java RolesAuthoritiesApplication , yang terdapat dalam projek GitHub.

Untuk melihat kebenaran berdasarkan peranan dalam tindakan, kita perlu:

  • Akses // localhost: 8082 / protectedbyrole
  • Sahkan sebagai [dilindungi e-mel] (kata laluan adalah "pengguna" )
  • Perhatikan kebenaran yang berjaya
  • Akses // localhost: 8082 / protectedbyauthority
  • Perhatikan kebenaran yang tidak berjaya

Untuk melihat kebenaran berdasarkan autoriti dalam tindakan, kita perlu log keluar dari aplikasi dan kemudian:

  • Akses // localhost: 8082 / protectedbyauthority
  • Sahkan sebagai [dilindungi e-mel] / pentadbir
  • Perhatikan kebenaran yang berjaya
  • Akses // localhsot: 8082 / protectedbyrole
  • Perhatikan kebenaran yang tidak berjaya

9. Kesimpulannya

Dalam tutorial ringkas ini, kami melihat perbezaan yang halus tetapi ketara antara Peranan dan GrantedAuthority dalam Spring Security.