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

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

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

登录之后的跳转

定义 Spring Security 配置类

@Configuration
@EnableWebSecurity
public class MySecurityConfig {
    // 自定义表单认证
    @Bean
    public 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 {
    @Override
    public 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 {
    // 自定义表单认证
    @Bean
    public 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 {
    // 自定义表单认证
    @Bean
    public 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 {
    @Override
    public 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 {
    // 自定义表单认证
    @Bean
    public 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 {
    // 自定义表单认证
    @Bean
    public 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 {
    @Override
    public 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 {
    // 自定义表单认证
    @Bean
    public 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();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/728359.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一个简单好用安全的开源交互审计系统,支持SSH,Telnet,Kubernetes协议

前言 在当今的企业网络环境中&#xff0c;远程访问和交互审计成为了保障网络安-全的重要组成部分。然而&#xff0c;现有的解-决方案往往存在一些痛点&#xff0c;如复杂的配置、有限的协议支持、以及审计功能的不足。这些问题不仅增加了IT管理员的负担&#xff0c;也为企业的…

第一个Java程序

编写第一个Java程序通常从经典的"Hello,World!"程序开始。下面是一个简单的Java程序示例&#xff0c;它将打印出"Hello, World!"到控制台&#xff1a; 1.编写代码&#xff1a; 打开文本编辑器&#xff08;如记事本、Notepad、Visual StudioCode等&#x…

JavaSE 利用正则表达式进行本地和网络爬取数据(爬虫)

爬虫 正则表达式的作用 作用1&#xff1a;校验字符串是满足规则 作用2&#xff1a;在一段文本中查找满足需要的内容 本地爬虫和网络爬虫 Pattern类 表示正则表达式 Matter类 文本编译器&#xff0c;作用按照正则表达式的规则去读取字符串&#xff0c;从头开始读取&#xf…

永磁同步电机最大转矩电流比(MTPA)与弱磁(FW)算法以及模型设计

永磁同步电机数学模型如下&#xff1a; 上式中&#xff1a; vd为 d 轴电压&#xff08;V&#xff09;。 vq为 q 轴电压&#xff08;V&#xff09;。 id为 d 轴电流&#xff08;A&#xff09;。 iq为 q 轴电流&#xff08;A&#xff09;。 Rs为定子相绕组电阻&#xff08;Ω…

SM9加密算法:安全、高效的国产密码技术

随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显。加密算法作为保障信息安全的核心技术&#xff0c;受到了广泛关注。在我国&#xff0c;一种名为SM9的加密算法逐渐崭露头角&#xff0c;凭借其卓越的安全性能和高效计算能力&#xff0c;成为了新一代国产密码技术的代表…

【鸿蒙】HUAWEI DevEco Studio安装

HUAWEI DevEco Studio介绍 面向HarmonyOS应用及元服务开发者提供的集成开发环境(IDE)&#xff0c; 助力高效开发。 DevEco Studio当前最新版本是&#xff1a; 3.1。 DevEco Studio计划里程碑 版本类型说明 下载 下载网址&#xff1a;DevEco Studio安装包官⽅下载 双击运行…

2024广东省职业技能大赛云计算赛项实战——编排部署ERP管理系统

编排部署ERP管理系统 前言 编写docker-compose.yaml文件&#xff0c;要求使用镜像mysql、redis、nginx和erp完成ERP管理系统的编排部署。 编写docker-compose.yaml完成ERP管理系统的部署&#xff0c;要求定义mysql、redis、nginx和erp共四个Service&#xff0c;分别使用镜像e…

前端 CSS 经典:flex + margin 布局

前言&#xff1a;如今我们布局大多时候都是用的 flex 布局&#xff0c;但是有时我们也可以使用 margin 小技巧去完成布局。在弹性盒中当我们把 margin 某一个方向上设置为 auto&#xff0c;他的含义是用 margin 吃掉这个方向的剩余空间。 1. 元素垂直和水平居中 <!DOCTYPE…

微软TTS最新模型,发布9种更真实的AI语音

很高兴与大家分享 Azure AI 语音翻译产品套件的两个重大更新&#xff1a; 视频翻译和增强的实时语音翻译 API。 视频翻译&#xff08;批量&#xff09; 今天&#xff0c;我们宣布推出视频翻译预览版&#xff0c;这是一项突破性的服务&#xff0c;旨在改变企业本地化视频内容…

《车载以太网通信测试》课程来袭!!!

本课程包含教程和脚本两部分内容。 教程 详细介绍以太网&#xff0c;如何理解TCP/IP协议&#xff0c;CAPL中涉及以太网的代码&#xff0c;以太网测试环境如何搭建&#xff0c;从物理层、链路层、网络层、传输层到应用层多种协议测试点的测试原理和测试方法介绍&#xff0c;中…

基于微信共享充电桩小程序毕业设计作品成品(3)开发技术文档_充电桩小程序前端技术栈

后台管理系统文件 所在路径&#xff1a;后台源码ht目录是后台 绿色显示的是系统框架&#xff0c;不要动 位置程序名说明源码根目录login.php后台登录页面源码根目录check_u_login.php后台登录处理程序ht 后台根目录index.php后台首页left.php后台左侧菜单u_logout.php退出登…

LeetCode 算法:K 个一组翻转链表 c++

原题链接&#x1f517;&#xff1a;K 个一组翻转链表 难度&#xff1a;困难⭐️⭐️⭐️ 题目 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k …

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验5 交换机的自学习算法

一、实验目的 1.验证交换机的自学习算法&#xff1b; 2.了解交换机对帧的过滤特性&#xff1b; 3.学习交换机如何登记接收到的数据包&#xff1b; 4.学习交换机如何转发数据包&#xff08;明确转发&#xff0c;盲目转发&#xff0c;丢弃&#xff09;。 二、实验要求 1.使用Cisc…

前端:2024年非常受欢迎非常火的 VueUI 库

目录 1、iView | 参考地址 2、Vux UI | 参考地址 3、Element UI | 参考地址 4、Mint UI | 参考地址 5、Bootstrap | 参考地址 6、Ant Design Vue | 参考地址 7、Vue Material | 参考地址 8、Vuetify | 参考地址 9、 Vuesax | 参考地址 10、Buefy | 参考地址 11、Va…

分布式理论与设计 四、分布式系统设计策略

在分布式环境下&#xff0c;有几个问题是普遍关心的&#xff1a; 如何检测当前节点还活着&#xff1f;如何保障高可用&#xff1f;容错处理负载均衡 1.心跳检测 在分布式环境中&#xff0c;我们提及过存在非常多的节点&#xff08;Node&#xff09;。那么就有一个非常重要的…

抉择与未来:高考后专业与学校的深度选择思考

引言 随着2024年高考的尘埃落定&#xff0c;数百万考生及其家庭正面临一个至关重要的决策&#xff1a;在有限的分数条件下&#xff0c;是优先选择专业还是学校&#xff1f;这一选择不仅影响着个人的未来职业道路&#xff0c;也关系到大学生活的质量和个人综合素质的培养。本文将…

C++ | Leetcode C++题解之第171题Excel表列序号

题目&#xff1a; 题解&#xff1a; class Solution { public:int titleToNumber(string columnTitle) {int number 0;long multiple 1;for (int i columnTitle.size() - 1; i > 0; i--) {int k columnTitle[i] - A 1;number k * multiple;multiple * 26;}return num…

ubuntu16因swap分区uuid错误启动慢排查

感觉ubuntu16启动特别慢 dmesg查看如下&#xff1a; [ 10.050123] audit: type1400 audit(1718608189.395:11): apparmor"STATUS" operation"profile_load" profile"unconfined" name"webbrowser-app//oxide_helper" pid708 comm&q…

Spring Boot轻松整合Minio实现文件上传下载功能

一、Linux 安装Minio 安装 在/root/xxkfz/soft目录下面创建文件minio文件夹&#xff0c;进入minio文件夹&#xff0c;并创建data目录&#xff1b; [rootxxkfz soft]# mkdir minio [rootxxkfz soft]# cd minio [rootxxkfz minio]# mkdir data执行如下命令进行下载 [rootxxkfz…

系统架构师考点--操作系统

大家好。今天我们来说一下操作系统考点&#xff0c;这部分考点出现在上午场考试&#xff0c;一般占3-5分左右。 一、操作系统概述 操作系统是指能有效地组织和管理系统中的各种软/硬件资源&#xff0c;合理地组织计算机系统工作流程&#xff0c;控制程序的执行&#xff0c;并…