Dapatkan Maklumat Pengguna dalam Keselamatan Musim Semi

1. Gambaran keseluruhan

Artikel ini akan menunjukkan cara mendapatkan maklumat pengguna di Spring Security .

Pengguna yang disahkan sekarang boleh didapati melalui beberapa mekanisme yang berbeza pada musim bunga - mari kita mulakan penyelesaian yang paling biasa - akses program.

2. Dapatkan Pengguna dalam Kacang

Cara paling mudah untuk mendapatkan semula prinsipal yang disahkan adalah melalui panggilan statik ke SecurityContextHolder :

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

Peningkatan pada coretan ini adalah terlebih dahulu memeriksa apakah ada pengguna yang disahkan sebelum mencuba mengaksesnya:

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

Sudah tentu ada kelemahan untuk melakukan panggilan statik seperti ini - penurunan kebolehpercayaan kod menjadi salah satu yang lebih jelas. Sebagai gantinya, kami akan mencari penyelesaian alternatif untuk keperluan yang sangat biasa ini.

3. Dapatkan Pengguna dalam Pengawal

Dalam kacang @Controller , terdapat pilihan tambahan. Pengetua dapat didefinisikan secara langsung sebagai argumen kaedah dan ia akan diselesaikan dengan betul 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 boleh menggunakan token pengesahan :

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

API kelas Pengesahan sangat terbuka sehingga kerangka kerja tetap fleksibel mungkin. Oleh kerana itu, prinsipal Spring Security hanya dapat diambil sebagai Objek dan perlu dihantar ke contoh UserDetails yang betul :

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

Dan akhirnya, secara 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 Antaramuka Tersuai

Untuk memanfaatkan sepenuhnya suntikan pergantungan Spring dan dapat mendapatkan pengesahan di mana-mana sahaja, bukan hanya di kacang @Controller , kita perlu menyembunyikan akses statik di sebalik fasad sederhana:

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

Fasad memperlihatkan objek Pengesahan sambil menyembunyikan keadaan statik dan memastikan kodnya dipisahkan 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 disahkan sekarang juga dapat diakses di halaman JSP , dengan memanfaatkan sokongan taglib keselamatan musim bunga. Pertama, kita perlu menentukan tag di halaman:

Seterusnya, kita boleh merujuk kepada prinsipal :

 authenticated as  

6. Dapatkan Pengguna di Thymeleaf

Thymeleaf adalah mesin templat web sisi pelayan moden, dengan integrasi yang baik dengan rangka kerja Spring MVC. Mari lihat bagaimana mengakses prinsipal yang disahkan pada halaman dengan mesin Thymeleaf.

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

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

Sekarang kita dapat merujuk kepada prinsipal di halaman HTML menggunakan atribut sec: authorize :

 Authenticated as 

7. Kesimpulannya

Artikel ini menunjukkan cara mendapatkan maklumat pengguna dalam aplikasi Spring, dimulai dengan mekanisme akses statik yang umum, diikuti dengan beberapa cara yang lebih baik untuk menyuntikkan prinsipal.

Pelaksanaan contoh-contoh ini boleh didapati di projek GitHub - ini adalah projek berasaskan Eclipse, jadi mudah untuk diimport dan dijalankan sebagaimana adanya. Apabila projek berjalan secara tempatan, HTML halaman utama dapat diakses di:

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