Spring Boot Security – Chuyển hướng đến các trang khác nhau sau khi Login Sử dụng AuthenticationSuccessHandler.
Trong bài hướng dẫn trước mình đã triển khai Spring Boot Security – Database authentication using JDBC.
Trong 1 số trường hợp, mình có thể muốn chuyển hướng user khác nhau đến các trang khác nhau tùy thuộc vào role của user được chỉ định trước đó. Ví dụ: mình muốn user có role là USER chuyển đến trang welcome, trong khi người dùng có role ADMIN sẽ được chuyển đến trang thêm nhân viên.
Mình sẽ sử dụng AuthenticaitonSuccessHandler.
Maven Project:
Them 1 class AuthenticationSuccessHandler sẽ thực hiện chuyển hướng user dựa trên role. Vì vậy, user javainuse sẽ được chuyển đến trang thêm nhân viên mới trong khi nhân viên nhân viên sẽ được chuyển đến trang welcome khi đăng nhập.
package com.javainuse.handler;
import java.io.IOException;
import java.util.Collection;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.web.DefaultRedirectStrategy;
import org.springframework.security.web.RedirectStrategy;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component;
@Component
public class EmployeeAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
@Override
public void onAuthenticationSuccess(HttpServletRequest arg0, HttpServletResponse arg1,
Authentication authentication) throws IOException, ServletException {
boolean hasUserRole = false;
boolean hasAdminRole = false;
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
for (GrantedAuthority grantedAuthority : authorities) {
if (grantedAuthority.getAuthority().equals("ROLE_USER")) {
hasUserRole = true;
break;
} else if (grantedAuthority.getAuthority().equals("ROLE_ADMIN")) {
hasAdminRole = true;
break;
}
}
if (hasUserRole) {
redirectStrategy.sendRedirect(arg0, arg1, "/welcome");
} else if (hasAdminRole) {
redirectStrategy.sendRedirect(arg0, arg1, "/addNewEmployee");
} else {
throw new IllegalStateException();
}
}
}
Code language: JavaScript (javascript)
Cuối cùng, sửa đổi cấu hình Spring Security để tự động truyền tải và sử dụng AuthenticationSuccessHandler tùy chỉnh.
package com.javainuse.config;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import com.javainuse.handler.EmployeeAuthenticationSuccessHandler;
@Configuration
@EnableWebSecurity
public class EmployeeSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
DataSource dataSource;
@Autowired
private EmployeeAuthenticationSuccessHandler successHandler;
// Enable jdbc authentication
@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().dataSource(dataSource);
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/resources/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/welcome").hasAnyRole("USER", "ADMIN")
.antMatchers("/getEmployees").hasAnyRole("USER", "ADMIN").antMatchers("/addNewEmployee")
.hasAnyRole("ADMIN").anyRequest().authenticated()
.and().formLogin().successHandler(successHandler)
.loginPage("/login").permitAll().and().logout().permitAll();
http.csrf().disable();
}
// @Autowired
// public void configureGlobal(AuthenticationManagerBuilder authenticationMgr)
// throws Exception {
// authenticationMgr.inMemoryAuthentication().withUser("admin").password("admin").authorities("ROLE_USER").and()
// .withUser("javainuse").password("javainuse").authorities("ROLE_USER",
// "ROLE_ADMIN");
// }
}
Code language: JavaScript (javascript)
Chạy ứng dụng và truy cập localhost:8080/welcome
Nhập javainuse người dùng và mật khẩu javainuse, người dùng được chuyển hướng đến trang thêm nhân viên.
Nhập nhân viên người dùng và nhân viên mật khẩu, người dùng được chuyển hướng đến trang chào mừng.
Nguồn:
https://www.javainuse.com/spring/boot_form_authentication_handler
Leave a Reply