Spring Security - Sesuaikan Halaman 403 Dilarang / Akses Ditolak

1. Pengenalan

Dalam artikel ini, kami akan menunjukkan cara menyesuaikan halaman yang ditolak akses dalam projek Spring Security .

Ini dapat dicapai sama ada melalui konfigurasi Spring Security atau konfigurasi aplikasi web dalam fail web.xml .

Pada bahagian yang tinggal, kami akan melihat lebih mendalam setiap pilihan ini.

2. JSP tersuai

Setiap kali pengguna cuba mengakses halaman yang terbatas pada peranan yang tidak mereka miliki, aplikasi akan mengembalikan kod status 403, yang berarti Akses Ditolak .

Untuk menggantikan halaman respons status Spring 403 dengan yang tersuai, pertama-tama kita buat fail JSP yang disebut accessDenied.jsp :

Sorry, you do not have permission to view this page.

Click here to go back to the Homepage.

3. Konfigurasi Keselamatan Musim Semi

Secara lalai, Spring Security mempunyai ExceptionTranslationFilter yang ditentukan yang mengendalikan pengecualian jenis AuthenticationException dan AccessDeniedException . Yang terakhir dilakukan melalui harta yang disebut accessDeniedHandler, yang menggunakan kelas AccessDeniedHandlerImpl .

Untuk menyesuaikan tingkah laku ini untuk menggunakan halaman kita sendiri yang kita buat di atas, kita perlu mengganti sifat kelas ExceptionTranslationFilter . Ini dapat dilakukan melalui konfigurasi Java atau konfigurasi XML.

3.1. Akses Halaman Ditolak

Menggunakan Java, kita boleh menyesuaikan proses pengendalian 403 ralat dengan menggunakan accessDeniedPage () atau accessDeniedHandler () kaedah manakala mengkonfigurasi HttpSecurity unsur.

Mari buat konfigurasi pengesahan yang menghadkan URL "/ admin / ** " ke peranan ADMIN dan tetapkan halaman yang ditolak akses ke halaman akses khusus kami. Denied.jsp :

@Override protected void configure(final HttpSecurity http) throws Exception { http // ... .and() .exceptionHandling().accessDeniedPage("/accessDenied.jsp"); }

Mari lihat konfigurasi XML yang setara untuk halaman yang ditolak akses:

3.2. Akses Penangan yang Ditolak

Menggunakan pengendali yang ditolak akses dan bukannya halaman mempunyai kelebihan bahawa kita dapat menentukan logik tersuai yang akan dilaksanakan sebelum mengalihkan ke halaman 403. Untuk ini, kita perlu membuat kelas yang menerapkan antara muka AccessDeniedHandler dan mengatasi kaedah handle () .

Mari buat kelas AccessDeniedHandler tersuai yang mencatat mesej amaran untuk setiap percubaan yang ditolak akses yang mengandungi pengguna yang membuat percubaan dan URL terlindung yang mereka cuba akses:

public class CustomAccessDeniedHandler implements AccessDeniedHandler { public static final Logger LOG = Logger.getLogger(CustomAccessDeniedHandler.class); @Override public void handle( HttpServletRequest request, HttpServletResponse response, AccessDeniedException exc) throws IOException, ServletException { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null) { LOG.warn("User: " + auth.getName() + " attempted to access the protected URL: " + request.getRequestURI()); } response.sendRedirect(request.getContextPath() + "/accessDenied"); } }

Dalam konfigurasi keselamatan, kami akan menentukan kacang dan menetapkan AccessDeniedHandler tersuai :

@Bean public AccessDeniedHandler accessDeniedHandler(){ return new CustomAccessDeniedHandler(); } //... .exceptionHandling().accessDeniedHandler(accessDeniedHandler()); 

Sekiranya kita ingin mengkonfigurasi kelas CustomAccessDeniedHandler yang ditentukan di atas menggunakan XML, konfigurasi akan kelihatan sedikit berbeza:

4. Konfigurasi Aplikasi

Menangani kesalahan yang ditolak akses dapat dilakukan melalui fail web.xml aplikasi web, dengan menentukan tag halaman kesalahan . Ini berisi dua subtag yang disebut ralat-kod, yang menentukan kod status yang akan dipintas, dan lokasi, yang menandakan URL yang akan diarahkan pengguna jika kod ralat ditemui:

 403 /accessDenied 

Sekiranya aplikasi tidak mempunyai fail web.xml , seperti halnya Spring Boot, anotasi Spring pada masa ini tidak memberikan alternatif yang tepat untuk tag halaman ralat . Menurut dokumentasi Spring, dalam hal ini, pendekatan yang disarankan adalah menggunakan metode accessDeniedPage () dan accessDeniedHandler () yang disajikan dalam bahagian 3.

5. Kesimpulan

Dalam artikel ringkas ini, kami telah memperincikan berbagai cara agar kesalahan yang ditolak akses dapat ditangani menggunakan halaman 403 khusus.

Kod sumber artikel yang lengkap boleh didapati di projek GitHub.