Springboot +spring security,登录表单进阶配置及原理分析

news2024/12/28 19:13:43

一.简介

登录表单配置实操

二.创建项目

如何创建一个SpringSecurity项目,前面文章已经有说明了,这里就不重复写了。

三.配置默认用户信息

配置文件添加如下用户信息,代码如下:

spring:
  security:
    user:
      name: lglbc
      password: 123456

四.基本登录表单配置

4.1添加SecurityConfig

添加SecurityConfig,代码如下:

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests((auth) ->{
            try {
                auth.anyRequest().authenticated()
                        .and()
                        .formLogin()
                        .loginPage("/login.html")
                        .loginProcessingUrl("/login")
                        .defaultSuccessUrl("/")
                        .failureUrl("/login.html")
                        .permitAll()
                        .and()
                        .csrf().disable();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

        });
        return http.build();
    }
}

这里简单解释下这段代码的意思:

  1. authorizeHttpRequests():开启权限配置。
  2. anyRequest().authenticated() 所有请求都需要认证。
  3. and()返回HttpSecurity,从头开始配置。
  4. formLogin()开启表单登陆,引入表单登陆过滤器(默认也会引入)。
  5. loginPage(“/login.html”) 自定义登录页面。
  6. loginProcessingUrl(“/login”) 定义登录提交的接口地址。
  7. defaultSuccessUrl 设置登录成功后的跳转地址。
  8. failureUrl 设置登录失败后的跳转地址。
  9. permitAll() 允许这些地址不需要认证。
  10. csrf().disable()security 支持csrf 防护,默认是开启,为了测试方便,这里暂时禁用,后面文章会详细介绍。

4.2创建登录页面

在resources/static 下面新建login.html,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/login" method="post">
    用户名:<input name="username" type="text"><br>
    密码:<input name="password" type="password"><br>
    <button type="submit">登陆</button>
</form>
</body>
</html>
  1. action:loginProcessingUrl(“/login”) 使用此值
  2. name:默认username和password

如何知道默认key是username和password 呢?有两种方法可以确定:

  1. 根据默认表单页面,查看网络请求,就能知道
  2. 看源码

4.3验证登录

启动项目后,打开http://localhost:8080,截图如下:

在这里插入图片描述
跳转到了我们定义的登录页面,输入上面定义的用户名和密码,截图如下:

在这里插入图片描述
这时候先输错密码,看看会怎么样?截图如下:

在这里插入图片描述
直接跳回登陆页面了,什么错误信息也没显示,为了能显示错误信息,我们需要做如下调整。

4.4开启登陆错误信息提示

  1. 引入thtmeleaf 依赖 implementation ‘org.springframework.boot:spring-boot-starter-thymeleaf’
  2. 调整security配置 将failureUrl(“/login.html”) 替换成 failureForwardUrl(“/login.html”)
  3. 复制login.html页面 到 resources/templates下面,添加如下内容:
  4. 创建一个控制器
    代码如下:
@RequestMapping("/loginFail")
    public String loginFail(){
        return "login";
    }

4.5验证登录失败

截图如下:
在这里插入图片描述
这里有个问题,为什么用户名输入的是正确的,反而还是提示用户名或密码错误呢,这个会在后面给大家说明。

五.进阶登录表单配置

5.1修改用户名和密码的key

代码如下:

.loginPage("/login.html")
                        .loginProcessingUrl("/login")
                        .defaultSuccessUrl("/")
                        .failureForwardUrl("/loginFail")
                        .passwordParameter("pwd")
                        .usernameParameter("uname")

5.2登陆成功后,返回JSON

代码如下:

.formLogin()
                        .loginPage("/login.html")
                        .loginProcessingUrl("/login")
                        .defaultSuccessUrl("/")
                        .failureForwardUrl("/loginFail")
                        .successHandler(new AuthenticationSuccessHandler() {
                            @Override
                            public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
                                Map<String,Object> result = new HashMap<>();
                                result.put("code",0);
                                result.put("msg","登陆成功");
                                result.put("data",authentication);
                                writeResp(result,response);
                            }
                        })

返回值截图如下:
在这里插入图片描述

5.3登陆失败后,返回JSON

代码如下:

.failureHandler(new AuthenticationFailureHandler() {
                            @Override
                            public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
                                Map<String,Object> result = new HashMap<>();
                                result.put("code",-1);
                                result.put("msg","登陆失败");
                                result.put("data",exception.getMessage());
                                writeResp(result,response);
                            }
                        })

返回值截图如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HNU数据结构与算法分析-作业7-算法设计技术

1. (简答题, 10分)请简述分治法所能解决的问题一般具有哪些特征&#xff1f; 2. (简答题, 10分)请简述动态规划法的四个求解步骤。 3. (简答题, 10分)请比较动态规划法和贪心法&#xff0c;并写出两者的区别。 4. (简答题, 10分)请写出分支限界法和回溯法的区别。 二. 算法设计…

chatgpt赋能Python-pythonendswith

Python endswith方法&#xff1a;介绍、用法和示例 在编程中&#xff0c;经常需要查找字符串是否以特定字符结尾。Python提供了一个方便易用的方法——endswith()。 什么是Python endswith()方法&#xff1f; Python endswith()方法是用于检查字符串是否以特定子字符串结尾的…

第六章总结-莫凡商城的注册、登录功能

1.微信小程序表单组件 1.1button按钮组件 type的属性值有三种 primary 绿色default 白色warn 红色 除了这种方式可以设置按钮大小&#xff0c;还有其他的通过视图来控制按钮的方式&#xff0c;因为我们知道&#xff0c;微信小程序的按钮并不都是这三种颜色。其他方式比如把按…

Web APIs之DOM

一.Web API基本认知 二.获取DOM对象 三.操作元素内容 四. 操作元素属性 五.定时器-间歇函数 一、Web API基本认知 *作用和分类 *什么是DOM *DOM树 *DOM对象 1.作用和分类 &#xff08;1&#xff09;作用&#xff1a;使用JS去操作html和浏览器 &#xff08;2&#xff09…

service mesh学习

背景 单体服务的痛点导致单体服务被拆分为多个微服 每个微服必须要解决负载均衡、服务发现、熔断等功能 为了让上层开发更加快速和无需关注通用能力&#xff0c;在网络栈和应用业务层之间抽出一个透明网络代理层。 Service Mesh 轻量级网络代理&#xff0c;负责微服之间的通…

H5 实现蜂巢(六边形)导航,支持用户交互和动态添加,纯css实现无需布局计算

最近公司的项目出了版新的UI设计图&#xff0c;所以准备进行样式改版 而其中就有个导航要改成蜂巢(六边形)导航&#xff0c;当我看到时其实也挺迷糊的。 说一下我一开始的想法哈&#xff1a; 我一开始是打算使用背景颜色线性渐变 或者 用4个子元素覆盖4角 来实现 六边形的视觉…

二、数据字典开发

文章目录 二、数据字典开发1、搭建service-cmn模块1.1 搭建service-cmn模块1.2 修改配置1.3 启动类 2、数据字典列表2.1 数据字典列表接口2.1.1 model模块添加数据字典实体2.1.2 添加数据字典mapper2.1.4 添加数据字典controller 2.2 数据字典列表前端2.2.1 添加路由2.2.2 定义…

centos 8 安装nacos2.0.3

去官网下载软件包 下载地址&#xff1a;https://github.com/alibaba/nacos/releases 上传到服务器指定位置&#xff0c;并解压 修改nacos存储为数据库 vi /xxx/nacos/conf/application.properties ## 在最后添加以下内容 spring.datasource.platformmysql db.num1 db.url.0j…

chatgpt赋能Python-pythonend

Pythonend – 一站式 Python SEO 工具 Pythonend 是一款基于 Python 的 SEO 工具&#xff0c;它为企业和个人提供了一站式的 SEO 解决方案。无论您是想要提高网站排名、监测关键词排名、分析竞争对手或进行网站优化&#xff0c;Pythonend 都可以帮助您解决这些问题。 Pythone…

【Linux】——进程信号

目录 信号入门 生活的角度 技术应用的角度 信号列表 信号处理常见方式概览 信号产生 通过终端按键产生信号 核心转储 调用系统函数向进程发信号 由软件条件产生信号 SIGPIPE信号 SIGALRM信号 硬件异常产生信号 阻塞信号 信号其他相关常见概念 内核中…

软件测试:测试用例

一、通用测试用例八要素  1、用例编号&#xff1b;   2、测试项目&#xff1b;   3、测试标题&#xff1b;   4、重要级别&#xff1b;   5、预置条件&#xff1b;   6、测试输入&#xff1b;   7、操作步骤&#xff1b;   8、预期输出 二、具体分析通用测试用…

红帽6.5进入单用户重置root密码

前言 ​一、重启Linux系统 二、按 “e” 键进入该界面 三、上下键选中第二个kernel选项&#xff0c;继续按 “e” 键进行编辑。 五、根据提示按下按键“b”&#xff0c;进入单用户模式引导 六、进入到单用户模式&#xff0c;修改密码 七、重启系统 八、进行登录 前言 大…

图片转excel表格,人工处理与OCR方案的优劣对比

随着信息化进程的发展&#xff0c;我们常常需要将图片文件中的表格信息转换成Excel表格文件&#xff0c;并进行后续数据处理和分析。对于这一需求&#xff0c;常用的解决方案有人工录入和OCR识别两种方式。本文将对这两种方案进行比较&#xff0c;评估其优劣。 一、人工做表并…

二、MongoDB入门

文章目录 一、MongoDB入门1、常用操作1.1 INSERT1.2 Query1.3 Update1.4 Remove1.5 aggregate1.5.1 插入数据1.5.2 统计sum1.5.3 常见的聚合表达式 1.6 索引 一、MongoDB入门 1、常用操作 1.1 INSERT > db.User.save({name:zhangsan,age:21,sex:true}) > db.User.find…

linux(inode)学习

目录&#xff1a; 1.认识磁盘结构 2.没有被打开的文件在磁盘里是怎么保存的 ------------------------------------------------------------------------------------------------------------------------------ 如果一个文件没有被打开&#xff0c;这个文件在哪里呢&#…

卡方检验.医学统计实例详解

卡方检验是一种常用的假设检验方法&#xff0c;通常用于分析两个或多个分类变量之间的关系。在医学研究中&#xff0c;卡方检验被广泛应用于分析两种或多种治疗方法的疗效&#xff0c;或者分析某种疾病的发病率与某些危险因素之间的关系。下面我们来看一个卡方检验在医学实例中…

虚幻商城模型转MetaHuman

一、导入虚幻商城的模型到UE 1.去虚幻商城下载一个人物模型,这里以SchoolGirl为例 2.导入UE,并找到模型,这里是SkeletalMesh 二、启动MetaHuman插件 1.通过Edit->Plugins启用MetaHuman和MetaHumanSDK插件,这里MetaHuman插件是用于创建MetaHuman的,MetaHumanSDK插件…

基于高效率IP路由查找的内容

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 实现最基本的前缀树查找,调研并实现某种IP前缀查找方案,- 基于forwarding-table.txt数据集(Network, Prefix Length, Port) - 本实验只考虑静态数据集&#xff0c;不考虑表的添加或更新- 以前缀树查找结果为基准&#xff0c;检…

代码随想录算法训练营day46 | 139.单词拆分 ,多重背包,背包问题总结篇!

代码随想录算法训练营day46 | 139.单词拆分 &#xff0c;多重背包&#xff0c;背包问题总结篇&#xff01; 139.单词拆分解法一&#xff1a;动态规划&#xff08;不好想&#xff09;解法二&#xff1a;回溯记忆化 多重背包解法一&#xff1a;转化为01背包 背包问题总结递推公式…