Persyaratan umum untuk aplikasi web adalah mengarahkan berbagai jenis pengguna ke halaman berbeda setelah login. Contohnya adalah mengarahkan pengguna standar ke /beranda. halaman html dan pengguna admin ke /console. halaman html misalnya
Artikel ini akan menunjukkan cara mengimplementasikan mekanisme ini dengan cepat dan aman menggunakan Spring Security. Artikel ini juga dibangun di atas tutorial Spring MVC yang berhubungan dengan pengaturan hal-hal inti MVC yang diperlukan untuk proyek tersebut
2. Konfigurasi Keamanan Pegas
Spring Security menyediakan komponen yang memiliki tanggung jawab langsung untuk memutuskan apa yang harus dilakukan setelah otentikasi berhasil – AuthenticationSuccessHandler
2. 1. Konfigurasi Dasar
Mari kita konfigurasikan class dasar @Configuration dan @Service
@Configuration @EnableWebSecurity public class SecSecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeRequests() // .. endpoints .formLogin() .loginPage("/login.html") .loginProcessingUrl("/login") .defaultSuccessUrl("/homepage.html", true) // .. other configuration return http.build(); } }Bagian dari konfigurasi ini yang menjadi fokus adalah metode defaultSuccessUrl(). Setelah login berhasil, setiap pengguna akan dialihkan ke beranda. html
Selanjutnya, kita perlu mengonfigurasi pengguna dan peran mereka. Untuk tujuan artikel ini, akan mengimplementasikan layanan UserDetailS sederhana dengan dua pengguna, masing-masing memiliki satu peran tunggal. Untuk informasi lebih lanjut tentang topik ini, baca artikel kami Keamanan Musim Semi – Peran dan Hak Istimewa
@Service public class MyUserDetailsService implements UserDetailsService { private Map<String, User> roles = new HashMap<>(); @PostConstruct public void init() { roles.put("admin2", new User("admin", "{noop}admin1", getAuthority("ROLE_ADMIN"))); roles.put("user2", new User("user", "{noop}user1", getAuthority("ROLE_USER"))); } @Override public UserDetails loadUserByUsername(String username) { return roles.get(username); } private List<GrantedAuthority> getAuthority(String role) { return Collections.singletonList(new SimpleGrantedAuthority(role)); } } _Perhatikan juga bahwa dalam contoh sederhana ini, kami tidak akan menggunakan pembuat enkode kata sandi, oleh karena itu kata sandi diawali dengan {noop}
2. 2. Menambahkan Handler Sukses Kustom
Kami sekarang memiliki dua pengguna dengan dua peran berbeda. pengguna dan admin. Setelah login berhasil, keduanya akan diarahkan ke beranda. html. Mari kita lihat bagaimana kita dapat memiliki pengalihan yang berbeda berdasarkan peran pengguna
Pertama, kita perlu mendefinisikan custom success handler sebagai bean
@Bean public AuthenticationSuccessHandler myAuthenticationSuccessHandler(){ return new MySimpleUrlAuthenticationSuccessHandler(); }Dan kemudian ganti panggilan defaultSuccessUrl dengan metode successHandler, yang menerima penangan sukses kustom kami sebagai parameter
2. 3. Konfigurasi XML
Sebelum melihat penerapan custom success handler kita, mari kita lihat juga konfigurasi XML yang setara
<http use-expressions="true" > <!-- other configuration --> <form-login login-page='/login.html' authentication-failure-url="/login.html?error=true" authentication-success-handler-ref="myAuthenticationSuccessHandler"/> <logout/> </http> <beans:bean id="myAuthenticationSuccessHandler" class="com.baeldung.security.MySimpleUrlAuthenticationSuccessHandler" /> <authentication-manager> <authentication-provider> <user-service> <user name="user1" password="{noop}user1Pass" authorities="ROLE_USER" /> <user name="admin1" password="{noop}admin1Pass" authorities="ROLE_ADMIN" /> </user-service> </authentication-provider> </authentication-manager>_3. Penangan Keberhasilan Otentikasi Khusus
Selain antarmuka AuthenticationSuccessHandler, Spring juga menyediakan default yang masuk akal untuk komponen strategi ini – AbstractAuthenticationTargetUrlRequestHandler dan implementasi sederhana – SimpleUrlAuthenticationSuccessHandler. Biasanya implementasi ini akan menentukan URL setelah login dan melakukan pengalihan ke URL tersebut
Meskipun agak fleksibel, mekanisme untuk menentukan URL target ini tidak memungkinkan penentuan dilakukan secara terprogram – jadi kami akan mengimplementasikan antarmuka dan memberikan implementasi kustom dari penangan keberhasilan. Implementasi ini akan menentukan URL untuk mengarahkan pengguna setelah login berdasarkan peran pengguna.
Pertama-tama, kita perlu mengganti metode onAuthenticationSuccess
Metode khusus kami memanggil dua metode pembantu
protected void handle( HttpServletRequest request, HttpServletResponse response, Authentication authentication ) throws IOException { String targetUrl = determineTargetUrl(authentication); if (response.isCommitted()) { logger.debug( "Response has already been committed. Unable to redirect to " + targetUrl); return; } redirectStrategy.sendRedirect(request, response, targetUrl); } _Di mana metode berikut melakukan pekerjaan sebenarnya dan memetakan pengguna ke URL target
protected String determineTargetUrl(final Authentication authentication) { Map<String, String> roleTargetUrlMap = new HashMap<>(); roleTargetUrlMap.put("ROLE_USER", "/homepage.html"); roleTargetUrlMap.put("ROLE_ADMIN", "/console.html"); final Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities(); for (final GrantedAuthority grantedAuthority : authorities) { String authorityName = grantedAuthority.getAuthority(); if(roleTargetUrlMap.containsKey(authorityName)) { return roleTargetUrlMap.get(authorityName); } } throw new IllegalStateException(); }Perhatikan bahwa metode ini akan mengembalikan URL yang dipetakan untuk peran pertama yang dimiliki pengguna. Jadi, jika pengguna memiliki banyak peran, URL yang dipetakan akan cocok dengan peran pertama yang diberikan dalam koleksi otoritas
protected void clearAuthenticationAttributes(HttpServletRequest request) { HttpSession session = request.getSession(false); if (session == null) { return; } session.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION); }_DeterminanTargetUrl – yang merupakan inti dari strategi – cukup melihat jenis pengguna (ditentukan oleh otoritas) dan memilih URL target berdasarkan peran ini
Jadi, pengguna admin – ditentukan oleh otoritas ROLE_ADMIN – akan dialihkan ke halaman konsol setelah login, sedangkan pengguna standar – sebagaimana ditentukan oleh ROLE_USER – akan dialihkan ke beranda
4. Kesimpulan
Seperti biasa, kode yang disajikan dalam artikel ini tersedia di GitHub. Ini adalah proyek berbasis Maven, jadi seharusnya mudah untuk diimpor dan dijalankan sebagaimana adanya