SpringBoot(5)集成Spring Security 5.0.11 自定义登录界面处理、认证成功处理、认证失败处理

目录

    • 我的环境
    • 自定义登录界面
    • 自定义认证成功处理器
    • 自定义认证失败处理器
    • 具体代码步骤
      • 项目整理结构
      • 项目依赖pom.xml
      • 应用启动类 SecurityServerApplication
      • HomeController 用来测试访问
      • Security配置类
      • 处理响应信息类
      • 自定义的认证成功处理器 AuthenticationSuccessHandlerImpl
      • 自定义的认证失败处理器 AuthenticationFailureHandlerImpl
      • 自定义的登录界面 login.html
      • 启动测试

我的环境

  • SpringBoot 2.0.8
  • Spring Security 5.0.11
  • JDK 1.8
  • Eclipse 4.11.0
  • Maven 3.5.4
  • Windows 10

自定义登录界面

自定义定义界面,需要做两件事情:
1.创建自己的登录界面,为了方便,我使用简单的html创建了一个登录界面。
2.配置登录界面的访问地址,这个访问地址。

自定义认证成功处理器

Spring Security 认证成功的处理是由AuthenticationSuccessHandler接口的实现类来完成的。
我们只要实现这个接口,实现onAuthenticationSuccess方法即可。

自定义认证失败处理器

Spring Security 认证失败的处理是由AuthenticationFailureHandler接口的实现类来完成的。
我们只要实现这个接口,实现onAuthenticationFailure方法即可。

具体代码步骤

项目整理结构

SpringBoot(5)集成Spring Security 5.0.11 自定义登录界面处理、认证成功处理、认证失败处理_第1张图片

项目依赖pom.xml


	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>io.spring.platformgroupId>
				<artifactId>platform-bomartifactId>
				<version>Cairo-SR7version>
				<type>pomtype>
				<scope>importscope>
			dependency>
			<dependency>
				<groupId>org.springframework.cloudgroupId>
				<artifactId>spring-cloud-dependenciesartifactId>
				<version>Finchley.RELEASEversion>
				<type>pomtype>
				<scope>importscope>
			dependency>
		dependencies>
	dependencyManagement>

	<repositories>
		<repository>
			<id>spring-milestonesid>
			<name>Spring Milestonesname>
			<url>https://repo.spring.io/libs-milestoneurl>
			<snapshots>
				<enabled>falseenabled>
			snapshots>
		repository>
	repositories>

	<dependencies>
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-webartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-securityartifactId>
		dependency>
		<dependency>
			<groupId>org.projectlombokgroupId>
			<artifactId>lombokartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-configuration-processorartifactId>
			<optional>trueoptional>
		dependency>
	dependencies>

应用启动类 SecurityServerApplication

@SpringBootApplication
public class SecurityServerApplication {
	public static void main(String[] args) throws Exception {
		SpringApplication.run(SecurityServerApplication.class, args);
	}

}

HomeController 用来测试访问

@RestController
public class HomeController {
	@GetMapping("/home")
	public String home() {
		return "home";
	}
}

Security配置类

代码中的loginPage就是指定登录界面

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

	@Autowired
	private AuthenticationSuccessHandlerImpl authenticationSuccessHandlerImpl;
	
	@Autowired
	private AuthenticationFailureHandlerImpl authenticationFailureHandlerImpl;
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.formLogin()
			.loginPage("/login.html") //自定义的登录,我们也可以使用spring mvc放回视图的方式
			.loginProcessingUrl("/authentication/form") //认证提交请求路径
			.successHandler(authenticationSuccessHandlerImpl) //认证通过的处理
			.failureHandler(authenticationFailureHandlerImpl) //认证失败的处理
				.and()
			.authorizeRequests()
			.antMatchers("/login.html").permitAll() // 访问这个请求的时候不需要身份认证
			.anyRequest()
			.authenticated() //其他任何请求需要认证
				.and()
			.csrf()
			.disable(); // 关闭跨站请求伪造功能
	}
}

处理响应信息类

public class SimpleResponse {

	private Object content;

	public SimpleResponse(Object content) {
		this.content = content;
	}

	public Object getContent() {
		return content;
	}

	public void setContent(Object content) {
		this.content = content;
	}

}

自定义的认证成功处理器 AuthenticationSuccessHandlerImpl

@Component
@Slf4j
public class AuthenticationSuccessHandlerImpl implements AuthenticationSuccessHandler {

	@Autowired
	private ObjectMapper objectMapper;
	
	@Override
	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
			Authentication authentication) throws IOException, ServletException {
		log.info("登录成功");
		response.setContentType("application/json;charset=UTF-8");
		response.getWriter().write(objectMapper.writeValueAsString(authentication));
	}
}

自定义的认证失败处理器 AuthenticationFailureHandlerImpl

@Component
@Slf4j
public class AuthenticationFailureHandlerImpl implements AuthenticationFailureHandler {

	@Autowired
	private ObjectMapper objectMapper;
	
	@Override
	public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
			AuthenticationException exception) throws IOException, ServletException {
		log.info("登录失败");
		response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); //500 服务器异常
		response.setContentType("application/json;charset=UTF-8");
		response.getWriter().write(objectMapper.writeValueAsString(new SimpleResponse(exception.getMessage())));
	}
}

自定义的登录界面 login.html


<html>
<head>
<meta charset="UTF-8">
<title>登录title>
head>
<body>
	<h2>标准登录页面h2>
	<h3>表单登录h3>
	<form action="/authentication/form" method="post">
		<table>
			<tr>
				<td>帐号:td>
				<td><input type="text" name="username">td>
			tr>
			<tr>
				<td>密码:td>
				<td>
					<input type="text" name="password">
				td>
			tr>
			<tr>
				<td colspan="2"><button type="submit">登录button>td>
			tr>
		table>
	form>
body>
html>

启动测试

访问 http://localhost:8080/home 跳转到了我们自己学的登录界面
SpringBoot(5)集成Spring Security 5.0.11 自定义登录界面处理、认证成功处理、认证失败处理_第2张图片
登录成功返回Authentication 对象内的存放的信息。
SpringBoot(5)集成Spring Security 5.0.11 自定义登录界面处理、认证成功处理、认证失败处理_第3张图片
登录失败
SpringBoot(5)集成Spring Security 5.0.11 自定义登录界面处理、认证成功处理、认证失败处理_第4张图片

你可能感兴趣的:(SpringBoot)