SpringSecurity6从入门到实战之登录后操作

2024-06-20 11:28

本文主要是介绍SpringSecurity6从入门到实战之登录后操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SpringSecurity6从入门到实战之登录后操作

上次已经了解了如何进行自定义登录页面,这次主要是详细讲解登录成功,登录之后的跳转以及包括退出登录等一系列操作.让我们来看看SpringSecurity需要如何进行配置

登录之后的跳转

定义 Spring Security 配置类

@Configuration
@EnableWebSecurity
public class MySecurityConfig {// 自定义表单认证@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests().requestMatchers("/test").permitAll() // 放行该资源.requestMatchers("/login.html").permitAll() // 放行该资源.anyRequest().authenticated() // 其它请求 必须先认证通过后 才能访问.and().formLogin() // 开启表单认证.loginPage("/login.html")  // 默认登录页.loginProcessingUrl("/doLogin")  // 处理登录请求的url.usernameParameter("uname") // 用户名文件框的名称.passwordParameter("upass") // 密码框的名称// 登录成功 跳转.successForwardUrl("/test") 	 //forward转发  跳转  不会跳转到之前请求路径//.defaultSuccessUrl("/test")   //redirect 重定向 如果之前有请求路径,会优先跳转之前请求的路径.and().csrf().disable();  // 关闭 CSRF;return http.build();}
}

这里就不一一进行测试展示了

成功后的跳转有两个方法 successForwardUrl 、defaultSuccessUrl

  • successForwardUrl forward 跳转 (注意:不会跳转到之前请求路径)
  • defaultSuccessUrl redirect 跳转 (注意:如果之前请求路径,会有优先跳转之前请求路径,可以通过第二个参数进行修改)
    .defaultSuccessUrl(“/test”, true) // redirect 跳转,且直接跳到 /test

登录成功之后返回JSON

在前后端分离开发中成功之后不需要跳转到页面,只需要给返回一个 JSON 通知登录成功还是失败即可。这个时候可以通过自定义 AuthenticationSucccessHandler 实现

自定义 AuthenticationSuccessHandler 的实现类

创建MyAuthenticationSuccessHandler实现AuthenticationSuccessHandler

public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {@Overridepublic void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {Map<String, Object> result = new HashMap<String, Object>();result.put("msg", "登录成功");result.put("status", 200);response.setContentType("application/json;charset=UTF-8");String s = new ObjectMapper().writeValueAsString(result);response.getWriter().println(s);}
}

定义 Spring Security 配置类

@Configuration
@EnableWebSecurity
public class MySecurityConfig {// 自定义表单认证@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests()// .....and().formLogin() // 开启表单认证// ....// 登录成功 JSON处理(将我们自定义 AuthenticationSuccessHandler 的实现类作为参数传入successHandler()即可).successHandler(new MyAuthenticationSuccessHandler()).and().csrf().disable();  //关闭 CSRF;return http.build();}
}

image.png

登录失败后的跳转

定义 Spring Security 配置类

@Configuration
@EnableWebSecurity
public class MySecurityConfig {// 自定义表单认证@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests()// .....and().formLogin() // 开启表单认证// ....// 登录失败 跳转.failureForwardUrl("/login.html") // 登录失败 forward跳转//.failureUrl("/login.html") // 登录失败 redirect跳转.and().csrf().disable();  // 关闭 CSRF;return http.build();}
}
# failureForwardUrl、failureUrl 方法类似于登录成功跳转时的 successForwardUrl 、defaultSuccessUrl 方法:- failureForwardUrl 登录失败后的 forward 跳转- failureUrl 登录失败后的 redirect 跳转

登录失败之后返回JSON

自定义 AuthenticationFailureHandler的实现类(这里与成功实现的类不一样注意!)

public class MyAuthenticationFailureHandler implements AuthenticationFailureHandler {@Overridepublic void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {HashMap<String, Object> result = new HashMap<>();result.put("msg", "登录失败!" + exception.getMessage());result.put("status", 500);response.setContentType("application/json; charset=UTF-8");String s = new ObjectMapper().writeValueAsString(result);response.getWriter().println(s);}
}

定义 Spring Security 配置类

@Configuration
@EnableWebSecurity
public class MySecurityConfig {// 自定义表单认证@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests()// .....and().formLogin() // 开启表单认证// ....// 登录失败 JSON处理.failureHandler(new MyAuthenticationFailureHandler()).and().csrf().disable();  // 关闭 CSRF;return http.build();}
}

退出登录之后的跳转

这里还是和上面的登录成功失败一样的流程只需要进行配置即可

定义 Spring Security 配置类

@Configuration
@EnableWebSecurity
public class MySecurityConfig {// 自定义表单认证@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests()// .....and().formLogin() // 开启表单认证// ....// 退出.and().logout().logoutUrl("/logout") // 默认 /logout.invalidateHttpSession(true) // 默认true 让当前session失效.clearAuthentication(true) // 默认true 清除当前认证标记.logoutSuccessUrl("/login.html") // 退出成功后 跳转到/login.html.and().csrf().disable();;return http.build();}
}

模拟主页,退出登录按钮

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>主页</title>
</head>
<body>
<h3>欢迎来到主页</h3>
当前用户:xxx <br/>
<a href="/logout">退出</a>
</body>
</html>

定义主页controller

IndexController

@Controller
public class IndexController {@RequestMapping("/index.html")public String index() {return "index";}
}

退出登录之后返回JSON

自定义 LogoutSuccessHandler 的实现类

也是跟上面一样的流程需要创建一个自定义 LogoutSuccessHandler 的实现类,然后进行配置

public class MyLogoutSuccessHandler implements LogoutSuccessHandler {@Overridepublic void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {HashMap<String, Object> result = new HashMap<>();result.put("msg", "退出成功!" + authentication);result.put("status", 200);response.setContentType("application/json; charset=UTF-8");String s = new ObjectMapper().writeValueAsString(result);response.getWriter().println(s);}
}

定义 Spring Security 配置类

@Configuration
@EnableWebSecurity
public class MySecurityConfig {// 自定义表单认证@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests()// .....and().formLogin() // 开启表单认证// ....// 退出.and().logout().logoutUrl("/logout") // 默认 /logout.invalidateHttpSession(true) // 默认true 让当前session失效.clearAuthentication(true) // 默认true 清除当前认证标记.logoutSuccessHandler(new MyLogoutSuccessHandler()).and().csrf().disable();;return http.build();}
}

这篇关于SpringSecurity6从入门到实战之登录后操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1078001

相关文章

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien