SpringSecurity6.x使用教程

SpringSecurity6.x使用

SpringSecurity版本

SpringSecurity目前支持的版本如下图所示,可以看到5.x的版本过几年就不会再维护了,6.x将成为主流。
在这里插入图片描述

入门

引入依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>

编写测试代码

@RestController
@RequestMapping("/test")
public class TestController {@GetMapping("/test1")public String test1() {return "Spring Security Demo";}
}

启动项目后,会跳转到下图的登录页
在这里插入图片描述
用户名是user,密码则会打印在控制台,输入用户名和密码以后就可以登录了。

这个页面是在DefaultLoginPageGeneratingFilter的generateLoginPageHtml方法中生成的,而密码则是在UsernamePasswordAuthenticationFilter中生成的。

配置用户和密码

yml配置
spring:application:name: SpringSecurityDemosecurity:user:name: admin  #用户名password: 888888  #密码roles:   #用户具有的角色- admin

使用配置类配置

    @Beanpublic UserDetailsService userDetailsService() {//使用hash加密UserDetails user = User.withUsername("admin").password("{bcrypt}admin").roles("USER").build();//使用bcrypt加密UserDetails root = User.withUsername("root").password(bCryptPasswordEncoder().encode("123456")).roles("admin", "user").build();//密码前面需要添加{id},id加密算法的名称,不然会报错,noop是不加密UserDetails root1 = User.withUsername("root1").password("{noop}123456").roles("admin", "user").build();return new InMemoryUserDetailsManager(user, root, root1);}@Beanpublic BCryptPasswordEncoder bCryptPasswordEncoder() {return new BCryptPasswordEncoder();}

常用的Handler

SpirngSecurity提供了针对各种异常处理的Handler,比如登录错误处理Handler、登录成功处理Handler等,我们只需要继承这些Handler实现自定义的逻辑即可。

登录成功登录失败

登录失败处理逻辑

@Component
public class LoginFailHandler implements AuthenticationFailureHandler {@Overridepublic void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {response.setContentType("text/html;charset=utf-8");response.getWriter().write("登录失败");exception.printStackTrace();}
}

登录成功处理逻辑

@Component
public class LoginSuccessHandler implements AuthenticationSuccessHandler {@Overridepublic void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {System.out.println("登录成功");response.setContentType("text/html;charset=utf-8");response.getWriter().write("登录成功");}
}

退出登录

成功退出登录时的处理逻辑

@Component
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {@Overridepublic void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {Object principal = authentication.getPrincipal();response.setContentType("application/json;charset=utf-8");PrintWriter out = response.getWriter();out.write(JSON.toJSONString(principal));out.flush();out.close();}}

授权失败

没有访问权限时的处理逻辑

@Component
public class MyAccessDeniedHandler implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {System.out.println("授权失败处理");response.setContentType("text/html;charset=utf-8");response.getWriter().write("没有访问权限");accessDeniedException.printStackTrace();}
}

Spring Security配置

如果想实现更多自定义的内容,则需要对SpringSecurity进行配置,比如上面自定义的登录成功Handler需要配置后才能生效。
配置主要内容如下:

  1. 登录配置:设置自定义登录页、登录接口、登录成功失败处理逻辑以及认证成功后跳转路径
  2. 授权配置:主要是设置哪些接口不需要登录认证就能访问,哪些接口需要登录认证后才能访问
@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {//表单提交httpSecurity.formLogin(formLogin -> formLogin//自定义登录页地址.loginPage("/login.html").successHandler(loginSuccessHandler).failureHandler(loginFailHandler)//登录接口.loginProcessingUrl("/test/login")//认证成功后跳转的路径.defaultSuccessUrl("/index.html"));//授权配置httpSecurity.authorizeHttpRequests(authorize -> authorize//设置哪些路径可以直接访问,不需认证.requestMatchers("/login.html", "/test/login", "/swagger-ui/index.html").permitAll()//其他的路径都需要认证.anyRequest().authenticated());//退出登录成功处理器httpSecurity.logout(logout -> logout.logoutSuccessHandler(logoutSuccessHandler));//授权失败处理配置httpSecurity.exceptionHandling(exceptionHandling ->exceptionHandling.accessDeniedHandler(accessDeniedHandler));//禁用csrfhttpSecurity.csrf(csrf -> csrf.disable());//设置自定义的UserDetailService,如果自定了UserDetailService,则需要设置这个httpSecurity.userDetailsService(userDetailsService);return httpSecurity.build();}

这个配置里需要注意的是loginProcessingUrl配置,loginProcessingUrl的作用是用来拦截前端页面对/login/doLogin这个的请求的,如果拦截到了就会走自己的请求,比如MyUserDetailService的loadUserByUsername方法。

完整代码

login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="/test/login" method="post">用户名:<input type="text" name="username"/><br/>密码:<input type="password" name="password"/><br/><input type="submit" value="提交"/>
</form></body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
index html
</body>
</html>

UserDetailService

@Service
public class MyUserDetailService implements UserDetailsService {@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//根据username从数据库中获取用户信息,并封装成UserDetails对象,SpringSecurity会根据返回的UserDetails和用户输入的密码进行比对String user = "root1";String password = "root1";return  User.withUsername(user).password(new BCryptPasswordEncoder().encode(password)).roles("USER").build();}}

Spring Secruity的配置,使用到的相关Handler在上文已经给出了

@Configuration
@EnableWebSecurity
public class SecurityConfig  {@Autowiredprivate LoginFailHandler loginFailHandler;@Autowiredprivate LoginSuccessHandler loginSuccessHandler;@Autowiredprivate MyAccessDeniedHandler accessDeniedHandler;@Autowiredprivate UserDetailsService userDetailsService;@Autowiredprivate LogoutSuccessHandler logoutSuccessHandler;@Beanpublic UserDetailsService userDetailsService() {//使用hash加密UserDetails user = User.withUsername("admin").password("{bcrypt}admin").roles("USER").build();//使用bcrypt加密UserDetails root = User.withUsername("root").password(bCryptPasswordEncoder().encode("123456")).roles("admin", "user").build();//密码前面需要添加{id},id加密算法的名称,不然会报错,noop是不加密UserDetails root1 = User.withUsername("root").password("{noop}123456").roles("admin", "user").build();return new InMemoryUserDetailsManager(user, root, root1);}@Beanpublic BCryptPasswordEncoder bCryptPasswordEncoder() {return new BCryptPasswordEncoder();}@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {//表单提交httpSecurity.formLogin(formLogin -> formLogin//自定义登录页地址.loginPage("/login.html").successHandler(loginSuccessHandler).failureHandler(loginFailHandler)//登录接口.loginProcessingUrl("/test/login")//认证成功后跳转的路径.defaultSuccessUrl("/index.html"));//授权配置httpSecurity.authorizeHttpRequests(authorize -> authorize//设置哪些路径可以直接访问,不需认证.requestMatchers("/login.html", "/test/login", "/swagger-ui/index.html").permitAll()//其他的路径都需要认证.anyRequest().authenticated());//退出登录成功处理器httpSecurity.logout(logout -> logout.logoutSuccessHandler(logoutSuccessHandler));//授权失败处理配置httpSecurity.exceptionHandling(exceptionHandling ->exceptionHandling.accessDeniedHandler(accessDeniedHandler));//禁用csrfhttpSecurity.csrf(csrf -> csrf.disable());//设置自定义的UserDetailService,如果自定了UserDetailService,则需要设置这个httpSecurity.userDetailsService(userDetailsService);return httpSecurity.build();}}

参考

  1. Spring Security官网
  2. SpringSecurity的 loginProcessingUrl为什么不能用
  3. spring security loginProcessingUrl无效问题

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

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

相关文章

CMS Made Simple v2.2.15 远程命令执行漏洞(CVE-2022-23906)

前言 CVE-2022-23906 是一个远程命令执行&#xff08;RCE&#xff09;漏洞&#xff0c;存在于 CMS Made Simple v2.2.15 中。该漏洞通过上传头像功能进行利用&#xff0c;攻击者可以上传一个经过特殊构造的图片文件来触发漏洞。 漏洞详情 CMS Made Simple v2.2.15 中的头像上…

【C++/STL】优先级队列的介绍与模拟实现仿函数

✨ 万物与我皆是自由诗 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1…

关于string的‘\0‘与string,vector构造特点加部分特别知识点的讨论

目录 前言&#xff1a; 问题一&#xff1a;关于string的\0问题讨论 问题二&#xff1a;C标准库中的string内存是分配在堆上面吗&#xff1f; 问题三&#xff1a;string与vector的capacity大小设计的特点 问题四&#xff1a;string的流提取问题 问题五&#xff1a;迭代器失…

04.ffmpeg打印音视频媒体信息

目录 1、相关头文件 2、相关结构体 3、相关函数 4、函数详解 5、源码附上 1、相关头文件 #include <libavformat/avformat.h> 包含格式相关的函数和数据结构 #include <libavutil/avutil.h> 包含一些通用实用函数 2、相关结构体 AV…

【PWN · ret2syscall | GoPwn】[2024CISCN · 华中赛区]go_note

一道GoPwn&#xff0c;此外便是ret2syscall的利用。然而过程有不小的曲折&#xff0c;参考 返璞归真 师傅的wp&#xff0c;堪堪完成了复现。复现过程中&#xff0c;师傅也灰常热情回答我菜菜的疑问&#xff0c;感谢&#xff01;2024全国大学生信息安全竞赛&#xff08;ciscn&am…

RabbitMQ快速入门 - 图像化界面的简单操作

目录 1、RabbitMQ的安装 2、RabbitMQ基本介绍 3、简单案例 4、数据隔离 1、RabbitMQ的安装 官网链接&#xff1a;rabbitmq官网 &#xff08;官网很详细&#xff0c;也可以在官网学习啦~&#xff09; 基础入门&#xff1a;自主学习&#xff1a;最新版本&#xff1a;安装我…

缓存-缓存的使用与基本详解

1.缓存使用 为了系统性能的提升&#xff0c;我们一般都会将部分数据放入缓存中&#xff0c;加速访问。而db承担数据落盘工作。 哪些数据适合放入缓存&#xff1f; 即时性、数据一致性要求不高的访问量大且更新频率不高的数据&#xff08;读多&#xff0c;写少&#xff09; …

如何配置 PostgreSQL 以实现高可用性和故障转移?

文章目录 一、高可用性和故障转移的概念&#xff08;一&#xff09;数据复制&#xff08;二&#xff09;监控和检测&#xff08;三&#xff09;快速切换 二、实现高可用性和故障转移的技术方案&#xff08;一&#xff09;流复制&#xff08;Streaming Replication&#xff09;&…

轻松创建对象——简单工厂模式(Java实现)

1. 引言 大家好&#xff0c;又见面了&#xff01;在上一篇文章中&#xff0c;我们通过Python示例介绍了简单工厂模式&#xff0c;今天&#xff0c;我们继续深入这个话题&#xff0c;用Java来实现简单工厂模式。 2. 什么是简单工厂模式 简单工厂模式&#xff08;Simple Facto…

idea部署war包成功,但是接口404

场景 项目结构 xxx-xxx-app xxx-xxx-service xxx-xxx-webappapp/webapp依赖service&#xff0c;service中写了各种api&#xff0c;先别管它合不合理&#xff0c;正式环境用webapp发布。 本地配置tomcat启动&#xff0c;但是发现每次部署成功&#xff0c;但是service中的接口…

【TB作品】脉搏测量,ATMEGA8单片机,Proteus仿真,ATmega8控制脉搏测量与显示系统

硬件组成&#xff1a; LCD1602脉搏测量电路&#xff08;带灯&#xff09;蜂鸣器报警按键设置AT24C02 功能&#xff1a; &#xff08;1&#xff09;LCD1602主页显示脉搏、报警上限、报警下限&#xff1b; &#xff08;2&#xff09;五个按键&#xff1a;按键1&#xff1a;切换设…

baomidou多数据源切换注解@DS没有效果

baomidou多数据源切换注解DS没有效果 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.1.1</version> </dependency> ##原因 方法上有Transaction…

Docker学习笔记(二)镜像、容器、仓库相关命令操作

一、docker镜像操作 列出镜像列表 我们可以使用 docker images 来列出本地主机上的镜像。 各个选项说明: REPOSITORY&#xff1a;表示镜像的仓库源 TAG&#xff1a;镜像的标签 IMAGE ID&#xff1a;镜像ID CREATED&#xff1a;镜像创建时间 SIZE&#xff1a;镜像大小 查…

昇思25天学习打卡营第9天|静态图模式的深度剖析与应用指南

目录 背景介绍 动态图模式 静态图模式 静态图模式的使用场景 静态图模式开启方式 基于装饰器的开启方式 基于context的开启方式 静态图的语法约束 JitConfig配置选项 静态图高级编程技巧 背景介绍 AI 编译框架主要包含两种运行模式&#xff0c;即动态图模式与静态图模…

19C 单机文件系统安装文档

准备工作 1)查看系统版本、内核参数 more /etc/redhat-release more /etc/redflag-releaseuname -a2)查看当前系统是否配置了HugePages。在下面的查询中&#xff0c;HugePages的几个相关值都为0&#xff0c;表明当前未配值HugePages&#xff0c;其次可以看到该版本的大页大小为…

Java之网络面试经典题(一)

目录 ​编辑 一.Session和cookie Cookie Session 二.HTTP和HTTPS的区别 三.浅谈HTTPS为什么是安全的&#xff1f; 四.TCP和UDP 五.GET和Post的区别 六.forward 和 redirect 的区别&#xff1f; 本专栏全是博主自己收集的面试题&#xff0c;仅可参考&#xff0c;不能相…

转发服务器实验

首先先克隆一个虚拟机并完成ip地址的修改 nmcli connection modify ens160 ipv4.addresses 192.168.209.128/24 nmcli connection modify ens160 ipv4.method manual nmcli connection modify ens160 connection.autoconnect yes nmcli connection up ens160 nmcli connection…

强化学习编程实战-1-一个及其简单的强化学习实例(多臂赌博机)

1.1 多臂赌博机 一台拥有K个臂的机器&#xff0c;玩家每次可以摇动K个臂中的一个&#xff0c;摇动后&#xff0c;会吐出数量不等的金币&#xff0c;吐出金币的数量服从一定的概率分布&#xff0c;而且不同臂的概率分布不同。 多臂赌博机的问题是&#xff1a;假设玩家共有N次摇地…

WPF中Background=“{x:Null}“ 和 Transparent

WPF中关于背景透明和背景无 此时&#xff0c;我代码中是写的有有个控件&#xff0c;一个Border &#xff0c;一个TextBox &#xff0c;范围都是全屏这么大&#xff0c;可以输入TextBox 因为&#xff0c;当border没有设置背景的时候&#xff0c;实际上是&#xff1a; <Borde…

尚庭公寓——数据库设计

1. 数据的关系 一对一&#xff0c;一对多&#xff08;多对一&#xff09;&#xff0c;多对多 2. 实体关系模型 实体关系模型常用ER图&#xff08;enity relationship graph&#xff09;表示&#xff1b; 矩形表示实体&#xff08;类似Java中的对象&#xff0c;如学生就是一…