SpringSecurity创建一个简单的自定义表单的认证应用

1、SpringSecurity 自定义表单

在 Spring Security 中创建自定义表单认证应用是一个常见的需求,特别是在需要自定义登录页面、认证逻辑或添加额外的表单字段时。以下是一个详细的步骤指南,帮助你创建一个自定义表单认证应用。

2、基于 SpringSecurity 的简单的认证

【示例】SpringBoot 整合 SpringSecurity 创建一个简单的认证应用。

(1)创建 SpringBoot 项目,项目结构如下图:

(2)添加 Maven 依赖

在 pom.xml 配置文件中添加 Spring Security 依赖、Thymeleaf 模板引擎。

<!-- Spring Security 依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId><version>2.7.18</version>
</dependency><!-- Thymeleaf 模板引擎 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

(3)创建配置类(核心代码)

创建 WebSecurityConfig 类(Spring Security 配置类),并添加 @EnableWebSecurity 注解和继承 WebSecurityConfigurerAdapter 类。

package com.pjb.securitydemo.config;import org.springframework.context.annotation.Bean;
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.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;/*** Spring Security 配置类* @author pan_junbiao**/
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
{@Overrideprotected void configure(HttpSecurity http) throws Exception{http.authorizeRequests() //返回一个URL拦截注册器.anyRequest() //匹配所有的请求.authenticated() //所有匹配的URL都需要被认证才能访问.and() //结束当前标签,让上下文回到 HttpSecurity.formLogin() //启动表单认证.loginPage("/myLogin.html") //自定义登录页面.loginProcessingUrl("/auth/form") //指定处理登录请求路径.permitAll() //使登录页面不设限访问.and().csrf().disable(); //关闭CSRF的防御功能}/*** 内存中添加登录账号(方式一)*/@Beanpublic UserDetailsService userDetailsService(){InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser(User.withUsername("admin").password("123456").roles("ADMIN").build());manager.createUser(User.withUsername("user").password("123456").roles("USER").build());manager.createUser(User.withUsername("panjunbiao").password("123456").roles("USER").build());return manager;}/*** 内存中添加登录账号(方式二)* AuthenticationManagerBuilder 允许配置认证账号*//*@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception{auth.inMemoryAuthentication().withUser("admin").password("123456").roles("ADMIN").and().withUser("user").password("123456").roles("USER").and().withUser("panjunbiao").password("123456").roles("USER");}*//*** 由于5.x版本之后默认启用了委派密码编译器,* 因而按照以往的方式设置内存密码将会读取异常,* 所以需要暂时将密码编码器设置为 NoOpPasswordEncoder*/@Beanpublic PasswordEncoder passwordEncoder(){return NoOpPasswordEncoder.getInstance();}
}

@EnableWebSecurity 是 Spring Security 提供的一个注解,用于启用 Spring Security 的 web 安全功能。当你在 Spring Boot 或 Spring MVC 应用程序中添加了@EnableWebSecurity 注解后,Spring Security 会自动配置一些默认的安全设置,比如基本的认证和授权机制。 

WebSecurityConfigurerAdapter 是 Spring Security 框架中的一个关键组件,它作为一个适配器类,允许开发者通过继承它并重写相关方法来自定义 Web 应用的安全设置。WebSecurityConfigurerAdapter 实现了 WebSecurityConfigurer 接口,并提供了默认的 Web 安全配置。它允许开发者通过重写特定的方法来定制安全行为,如配置认证和授权规则、处理用户会话管理、跨站请求伪造(CSRF)防护等。

(4)编写控制器类

创建 IndexController 控制器类,实现跳转到首页,同时获取当前登录人的名称。

package com.pjb.securitydemo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import java.security.Principal;/*** 首页控制器* @author pan_junbiao**/
@Controller
public class IndexController
{/*** 首页*/@RequestMapping("/")public String index(HttpServletRequest request){//获取当前登录人String userName = "未登录";Principal principal = request.getUserPrincipal();if(principal!=null){userName = principal.getName();}//返回页面request.setAttribute("userName",userName);return "/index.html";}}

(5)编写登录页面

在 resources\static 资源目录下,创建 myLogin.html 页面。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录</title>
</head>
<body>
<form name="myForm" action="/auth/form" method="post"><table align="center"><caption>用户登录</caption><tr><td>登录账户:</td><td><input type="text" name="username" placeholder="请输入登录账户" value="panjunbiao" /></td></tr><tr><td>登录密码:</td><td><input type="password" name="password" placeholder="请输入登录密码" value="123456" /></td></tr><!-- 以下是提交、取消按钮 --><tr><td colspan="2" style="text-align: center; padding: 5px;"><input type="submit" value="提交" /><input type="reset" value="重置" /></td></tr></table>
</form>
</body>
</html>

(6)编写首页

在 resources\templates 资源目录下,创建 index.html 页面。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>首页</title><meta name="author" content="pan_junbiao的博客">
</head>
<body><h1 style="color: red">Hello,Spring Security</h1><p>博客信息:您好,欢迎访问 pan_junbiao的博客</p><p>博客地址:https://blog.csdn.net/pan_junbiao</p><p th:text="'当前登录人:' + ${userName}"></p><a href="/logout" onclick="return confirm('确认注销吗?');">登出</a>
</body>
</html>

(7)运行项目

(8)成功登录后,跳转至首页

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

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

相关文章

用python简单集成一个分词工具

本部分记录如何利用Python进行分词工具集成&#xff0c;集成工具可以实现运行无环境要求&#xff0c;同时也更方便。 该文章主要是记录&#xff0c;知识点不是特别多&#xff0c;欢迎访问个人博客&#xff1a;https://blog.jiumoz.top/archives/fen-ci-gong-ju-ji-cheng 成品展…

Fakelocation Server服务器/专业版 Windows11

前言:需要Windows11系统 Fakelocation开源文件系统需求 Windows11 | Fakelocation | 任务一 打开 PowerShell&#xff08;以管理员身份&#xff09;命令安装 Chocolatey Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProto…

【云计算】腾讯云架构高级工程师认证TCP--考纲例题,知识点总结

【云计算】腾讯云架构高级工程师认证TCCP–知识点总结&#xff0c;排版整理 文章目录 1、云计算架构概论1.1 五大版块知识点&#xff08;架构设计&#xff0c;基础服务&#xff0c;高阶技术&#xff0c;安全&#xff0c;上云&#xff09;1.2 课程详细目录1.3 云基础架构设计1.4…

HarmonyOs鸿蒙开发实战(22)=>开源插件集成-城市选择案例(带字母索引可修改源码)

1.第一步>DevEco Studio集成开源插件 1.1.下载资源插件 1.2.打开Perferences页面&#xff0c;从本地导入安装插件 2.第二步>导入HarmonyOs Next组件市场的城市选择案例&#xff0c;安装 2.1. 代码空白处右键&#xff0c;打开开源组件弹窗 2.2. 安装城市选择案例 3.第三步…

ROS之什么是Node节点和Package包?

1.什么是ROS&#xff1f; 官方术语&#xff1a;ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;是一个开源的、模块化的机器人软件框架。它为机器人开发提供了一套工具和库&#xff0c;用于实现硬件抽象、设备驱动、消息传递、多线程管理等功能…

Windows环境安装MongoDB

文章目录 1. 下载MongoDB2. 安装MongoDB3. Compass-图形化界面客户端4. 更换Compass的主题 阅读本文前可以先阅读以下文章&#xff1a; MongoDB快速入门&#xff08;MongoDB简介、MongoDB的应用场景、MongoDB中的基本概念、MongoDB的数据类型、MongoDB的安装与部署、MongoDB的常…

在线解析工具链接

在线字数统计工具-统计字符字节汉字数字标点符号-计算word文章字数字数统计,字符统计,字节统计,字数计算,统计字数,统计字节数,统计字符数,统计word字数,在线字数统计,在线查字数,计算字数,字数统计工具,支持手机移动端查询多少字数,英文:Calculate the number of words,Count …

RTL8211F 1000M以太网PHY指示灯

在RK3562 Linux5.10 SDK里面已支持该芯片kernel-5.10/drivers/net/phy/realtek.c&#xff0c;而默认是没有去修改到LED配置的&#xff0c;我们根据硬件设计修改相应的寄存器配置&#xff0c;该PHY有3个LED引脚&#xff0c;我们LED0不使用&#xff0c;LED1接绿灯&#xff08;数据…

通关C语言自定义类型:联合和枚举

C语言的自定义类型有四个分别是&#xff1a;数组&#xff1b;结构体&#xff08;struct&#xff09;&#xff1b;联合体&#xff08;union&#xff09;&#xff1b;枚举&#xff08;enum&#xff09;。前面已经讨论过数组和结构体&#xff0c;这期让我们来学习一下联合体和枚举…

java八股-SpringCloud微服务-Eureka理论

文章目录 SpringCloud架构Eureka流程Nacos和Eureka的区别是&#xff1f;CAP定理Ribbon负载均衡策略自定义负载均衡策略如何实现&#xff1f;本章小结 SpringCloud架构 Eureka流程 服务提供者向Eureka注册服务信息服务消费者向注册中心拉取服务信息服务消费者使用负载均衡算法挑…

介绍一下toupper(ch);函数(c基础)

hi , I am 36 适合对象c语言初学者 toupper(ch1); tolower(ch2); 是返回ch的大写或小写的字符但并不改变ch 若传递数字仍返回该数字 格式 #include<ctype.h> char res toupper(ch); 链接扫雷游戏代码分享(c基础)-CSDN博客 hi , I am 36. thanks for your look…

数据结构(Java版)第二期:包装类和泛型

目录 一、包装类 1.1. 基本类型和对应的包装类 1.2. 装箱和拆箱 1.3. 自动装箱和自动拆箱 二、泛型的概念 三、引出泛型 3.1. 语法规则 3.2. 泛型的优点 四、类型擦除 4.1. 擦除的机制 五、泛型的上界 5.1. 泛型的上界的定义 5.2. 语法规则 六、泛型方法 6.1…

敬请关注:CEPGT 2024 新增主讲

Prof. Marc A. Rosen, Ontario Tech University, Canada 曾担任安大略省理工大学工程与应用科学学院创始院长、加拿大工程学院院长和加拿大机械工程学会会长。 他的主要研究领域是能源、热力学、可持续发展等。Google Scholar Citations 48000余次&#xff0c;H指数98。Prof. …

【Python】30个Python爬虫的实战项目!!!(附源码)

Python爬虫是数据采集自动化的利器。本文精选了30个实用的Python爬虫项目&#xff0c;从基础到进阶&#xff0c;每个项目都配有完整源码和详细讲解。通过这些项目的实战&#xff0c;可以全面掌握网页数据抓取、反爬处理、并发下载等核心技能。 一、环境准备 在开始爬虫项目前…

如何编译 Cesium 源码

如何编译 Cesium 源码 Cesium 是一个开源的 JavaScript 库&#xff0c;用于构建 3D 地球和地图应用程序。它提供了一套强大的 API 和工具&#xff0c;使开发者能够创建丰富的地理空间应用。本文将指导您如何从 GitHub 下载 Cesium 源码&#xff0c;并在本地进行编译。 TilesB…

计算服务器定制化,计算力提升的关键!

如今&#xff0c;计算服务器的性能、成本、灵活性以及可靠性等因素对于企业的运营和发展起着至关重要的作用。定制服务器&#xff0c;作为一种根据企业特定需求和业务特点专门设计制造的服务器解决方案&#xff0c;正逐渐成为众多企业的明智之选。 对于计算服务器而言&#xff…

51WORLD与南京水利研究院联合研发,国产数字孪生超融合一体机

近日&#xff0c;太湖流域水治理国际会议在江苏省无锡市举行。大会由水利部国际合作与科技司、河湖管理司、中国水利学会、水利部太湖流域管理局、无锡市人民政府、中国交通建设集团有限公司指导&#xff0c;南京水利科学研究院主办&#xff0c;以“践行新发展理念、推进流域水…

STL关联式容器之map

map的特性是&#xff0c;所有元素都会根据元素的键值自动被排序。map的所有元素都是pair&#xff0c;同时拥有实值(value)和键值(key)。pair的第一元素被视为键值&#xff0c;第二元素被视为实值。map不允许两个元素拥有相同的键值。下面是<stl_pair.h>中pair的定义 tem…

python小课堂(一)

基础语法 1 常量和表达式2 变量和类型2.1 变量是什么2.2 变量语法 3 变量的类型3.1 动态类型特性 4 注释4.1注释是什么 5 输入输出5.1 print的介绍5.2 input 6 运算符6.1 算术运算符在这里插入图片描述6.2 关系运算符6.3 逻辑运算符6.4赋值运算符 1 常量和表达式 在print()中可…

Qt:信号槽

一. 信号槽概念 信号槽 是 Qt 框架中一种用于对象间通信的机制 。它通过让一个对象发出信号&#xff0c;另一个对象连接到这个信号的槽上来实现通信。信号槽机制是 Qt 的核心特性之一&#xff0c;提供了一种灵活且类型安全的方式来处理事件和数据传递。 1. 信号的本质 QT中&a…