Ambil Informasi Pengguna di Keamanan Musim Semi

1. Ikhtisar

Artikel ini akan menunjukkan cara mendapatkan detail pengguna di Keamanan Musim Semi .

Pengguna yang saat ini diautentikasi tersedia melalui sejumlah mekanisme berbeda di Spring - mari kita bahas solusi yang paling umum - akses terprogram, terlebih dahulu.

2. Dapatkan Pengguna di Bean

Cara termudah untuk mengambil prinsipal yang saat ini diautentikasi adalah melalui panggilan statis ke SecurityContextHolder :

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); String currentPrincipalName = authentication.getName();

Perbaikan pada cuplikan ini adalah memeriksa terlebih dahulu apakah ada pengguna yang diautentikasi sebelum mencoba mengaksesnya:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (!(authentication instanceof AnonymousAuthenticationToken)) { String currentUserName = authentication.getName(); return currentUserName; }

Tentu saja ada kerugian untuk memiliki panggilan statis seperti ini - penurunan testabilitas kode menjadi salah satu yang lebih jelas. Sebaliknya, kami akan mencari solusi alternatif untuk persyaratan yang sangat umum ini.

3. Dapatkan Pengguna dalam Kontroler

Dalam kacang beranotasi @Controller , ada opsi tambahan. Kepala sekolah dapat didefinisikan secara langsung sebagai argumen metode dan akan diselesaikan dengan benar oleh kerangka kerja:

@Controller public class SecurityController { @RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserName(Principal principal) { return principal.getName(); } }

Sebagai alternatif, kami juga dapat menggunakan token otentikasi :

@Controller public class SecurityController { @RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserName(Authentication authentication) { return authentication.getName(); } }

API kelas Authentication sangat terbuka sehingga framework tetap sefleksibel mungkin. Karena itu, prinsip Keamanan Musim Semi hanya dapat diambil sebagai Objek dan perlu dikirim ke contoh UserDetails yang benar :

UserDetails userDetails = (UserDetails) authentication.getPrincipal(); System.out.println("User has authorities: " + userDetails.getAuthorities());

Dan terakhir, langsung dari permintaan HTTP :

@Controller public class GetUserWithHTTPServletRequestController { @RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserNameSimple(HttpServletRequest request) { Principal principal = request.getUserPrincipal(); return principal.getName(); } }

4. Dapatkan Pengguna melalui Antarmuka Kustom

Untuk sepenuhnya memanfaatkan injeksi ketergantungan Spring dan dapat mengambil otentikasi di mana saja, tidak hanya di kacang @Controller , kita perlu menyembunyikan akses statis di belakang fasad sederhana:

public interface IAuthenticationFacade { Authentication getAuthentication(); } @Component public class AuthenticationFacade implements IAuthenticationFacade { @Override public Authentication getAuthentication() { return SecurityContextHolder.getContext().getAuthentication(); } }

Fasad mengekspos objek Authentication sambil menyembunyikan status statis dan menjaga agar kode tetap terpisah dan dapat diuji sepenuhnya:

@Controller public class GetUserWithCustomInterfaceController { @Autowired private IAuthenticationFacade authenticationFacade; @RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserNameSimple() { Authentication authentication = authenticationFacade.getAuthentication(); return authentication.getName(); } }

5. Dapatkan Pengguna di JSP

Prinsipal yang saat ini diautentikasi juga dapat diakses di halaman JSP , dengan memanfaatkan dukungan taglib keamanan pegas. Pertama, kita perlu mendefinisikan tag di halaman:

Selanjutnya, kita bisa merujuk ke kepala sekolah :

 authenticated as  

6. Dapatkan Pengguna di Thymeleaf

Thymeleaf adalah mesin template web sisi server modern, dengan integrasi yang baik dengan kerangka MVC Spring. Mari kita lihat cara mengakses prinsipal yang saat ini diautentikasi di halaman dengan mesin Thymeleaf.

Pertama, kita perlu menambahkan dependensi thymeleaf-spring5 dan thymeleaf-extras-springsecurity5 untuk mengintegrasikan Thymeleaf dengan Spring Security:

 org.thymeleaf.extras thymeleaf-extras-springsecurity5   org.thymeleaf thymeleaf-spring5 

Sekarang kita bisa merujuk ke kepala sekolah di halaman HTML menggunakan atribut sec: authorize :

 Authenticated as 

7. Kesimpulan

Artikel ini menunjukkan cara mendapatkan informasi pengguna dalam aplikasi Spring, dimulai dengan mekanisme akses statis umum, diikuti dengan beberapa cara yang lebih baik untuk memasukkan prinsipal.

Penerapan contoh-contoh ini dapat ditemukan di proyek GitHub - ini adalah proyek berbasis Eclipse, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya. Ketika proyek berjalan secara lokal, HTML beranda dapat diakses di:

//localhost:8080/spring-security-rest-custom/foos/1