Spring Boot Security – Chuyển hướng đến các trang khác nhau sau khi Login Sử dụng AuthenticationSuccessHandler.

Spring Boot Starters & Common Configurations Thực hành

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:

boot-36_4

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

boot-36_1

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.

boot-35_9

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.

boot-35_3

Nguồn:

https://www.javainuse.com/spring/boot_form_authentication_handler

Leave a Reply

Your email address will not be published. Required fields are marked *