当前位置: 首页 > news >正文

SpringSecurity学习总结(三更草堂)

SpringSecurity安全框架的核心功能认证授权

        认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户。

        授权:经过认证后判断当前用户是否具有进行某个操作权限。

        一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多,因为相比与SpringSecurity,Shiro的上手更加的简单。

二、入门案例:

2.1、创建Springboot项目:勾选SpringSecurity依赖

在SpringBoot项目中使用SpringSecurity我们只需要引入依赖即可实现入门案例:

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

        引入依赖后,启动Springboot应用,尝试去访问hello接口就会自动跳转到一个SpringSecurity的默认登陆页面,默认用户名是user, 密码会输出在控制台,必须登陆之后才能对接口进行访问:

@RestController
public class SecurityController {@RequestMapping("/hello")public String helloController(){return "欢迎使用SpringSecurity";}
}
2.2、启动应用,访问接口:

        当我们访问:http://localhost:8080/hello 时,会自动跳转到默认的登陆页面:

2.3、入门案例中 SpringSecurity 的流程:

        SpringSecurity 的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器 ,这里我们可以看看入门案例中的过滤器:图中只展示了核心过滤器,其它的非核心过滤器没有展示。

        UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名、密码后的登陆请求。入门案例的认证工作主要有它负责。

    ExceptionTranslationFilter: 处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException 。

        FilterSecurityInterceptor: 负责权限校验的过滤器

 我们可以通过Debug查看当前系统中SpringSecurity过滤器链中有哪些过滤器及它们的顺序:

入门案例中的SpringSecurity过滤器链里有15个过滤器:

        {DefaultLoginPageGeneratingFilter@6504} 这个Filter功能是用来显示默认的登录页,如果说你不想要默认登录页,到时候不要加他就可以了,

        {DefaultLogoutPageGerneratingFilter@6505}这个Filter功能是用来显示默认的注销页面

2.4、入门认证流程详解:

概念速查:

Authentication接口: 它的实现类,表示当前访问系统的用户,封装了用户相关信息。它用来表示的是当前访问系统的用户,可以在里面封装一些用户的相关信息,比如说用户名、密码,然后包括用户的一些权限都可以。但是在这个情况下,你看他只提交了用户名、密码,那他装的对象里面也只有用户名和密码信息

AuthenticationManager接口:定义了认证Authentication的方法

UserDetailsService接口:加载用户特定数据的核心接口。里面定义了一个根据用户名查询用户信息的方法。会把这些用户信息权限信息又封装成一个UserDetails对象,这也是一个接口,它的核心提供了用户信息,我们可以把查到的用户的一些信息封装到这个接口的一个对象里面去。

UserDetails接口:提供核心用户信息。通过UserDetailsService根据用户名获取处理的用户信息要封装成UserDetails对象返回。然后将这些信息封装到Authentication对象中。
 

2.5、入门案例的缺点分析:

        1、在我们前后端分离的项目中,我们不需要springsecurity提供的默认登录页,给它删除,我们需要自定义登录接口;

        2、入门案例里面用户名和密码,用户名默认为user,密码是它随机生成的,这肯定是不行的。我们应该是让他去数据库里面去进行用户名、密码的校验;

        3、入门案例它是基于session去实现这种登录。前后端不分离的时候可以用session,前后端分离,就不能使用session了,当用户的用户名、密码校验成功后,我们应该①:以用户id生成jwt,作为token响应给前端;② 同时以用户id作为key,用户信息作为value,存入Redis中;(实际项目中用不用 "用户id" 作为jwt、作为key看具体的项目需求)

        4、当我们校验用户有没有权限去访问当前他所请求的这个资源时,我们应该去获取请求头中的token进行解析,去判断有没有权限访问当前资源 

三、自定义登录的认证:

  实际前后端分离的项目中,去进行认证,核心其实依赖的就是token,你可以理解成它是一个加密之后的一个字符串,我通过前端是否携带这个token,去判断你是不是我系统的用户、你究竟是哪一个用户,这是它的一个核心思路

3.1、自定义的登录认证需要实现两大功能:登录、校验

登录

​         ①自定义登录接口:

                 把用户输入的用户名和密码封装成Authentication对象

​                 调用ProviderManager的authenticate()方法进行认证

                 如果认证没通过给用户对应的提示信息

                 如果认证通过则生成jwt作为token返回给前端,并且把用户信息存入redis中

​         ②自定义UserDetailsService接口的实现类

​                 在这个实现类中去查询数据库

校验:

​         ①定义Jwt认证过滤器

​                 获取token

​                 解析token获取其中的userid

​                 从redis中获取用户信息

​                 存入SecurityContextHolder

3.2、"自定义登录接口"的具体思路、流程:

        ①、默认情况下定义的接口,都会被我们SpringSecurity保护,要求必须认证后,才能够访问,而这个登录接口,必须设置为让SpringSecurity放行,让用户访问登录接口的时候不需要登录也能够访问,否则会相互矛盾

        ②、我们自定义一个登录接口,其实就是定义一个Controller去接受用户输入的用户名和密码,然后在Controller中去调用Service,在Service当中进行具体的业务操作,这个登录接口的请求方式为Post,所以要使用@PostMapping

         ③、具体的业务操作包括:

用户名和密码封装成Authentication对象

调用AuthenticationManager的authenticate()方法进行认证

密码加密存储PassWordEncoder

        实际项目中我们不会把密码明文存储在数据库中。
        默认使用的PasswordEncoder要求数据库中的密码格式为: {id}password。它会根据id去判断密码的加密方式,如果没加密,就是{noop}password。但是我们一般不会采用这种方式。所以需要替换PasswordEncoder。 
        我们一般使用SpringSecurity为我们提供的BCryptPasswordEncoder,我们只需要使用把BCryptPasswordEncoder对象注入Spring容器中,SpringSecurity就会使用BCryptPasswordEncoder来进行密码校验。

BCryptPasswordEncoder简介:

1 、BCryptPasswordEncoder是采用SHA-256 +随机盐+密钥对明文密码进行加密。SHA系列是Hash算法,不是加密算法,使用加密算法意味着可以解密(这个与编码/解码一样),但是采用Hash处理,其过程是不可逆的。BCrypt 是一种强哈希算法,它能很好地防止被暴力破解。

2、加密(encode):注册用户时,采用SHA-256+随机盐+密钥把用户输入的密码进行hash处理,得到密码的hash值,然后将其存入数据库中。因为每次的随机盐不同,导致对同一明文密码加密后得到的加密结果都不一样。密文中本身包含了很多信息,包括 salt 和 使用 salt 加密后的 hash。

3、密码匹配(matches):用户登录时,密码匹配阶段并没有进行密码解密(因为密码经过Hash处理,是不可逆的),而是使用相同的算法把用户输入的密码进行hash处理,得到密码的hash值,然后将其与从数据库中查询到的密码hash值进行比较。如果两者相同,说明用户输入的密码正确。

4、这正是为什么处理密码时要用hash算法,而不用加密算法。因为这样处理即使数据库泄漏,黑客也很难破解密码!


 BCryptPasswordEncoder举例:

        我们可以定义一个SpringSecurity的配置类,SpringSecurity要求这个配置类要继承WebSecurityConfigurerAdapter:

@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {@Beanpublic PasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}
}

 

@SpringBootTest
class Boot3SpringsecurityApplicationTests {@Autowiredprivate BCryptPasswordEncoder passwordEncoder;@Testpublic void testBCryptPasswordEncoder(){// BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();//传入密码的明文,它就会帮你进行加密,然后返回加密之后的字符串String encode1 = passwordEncoder.encode("123456");String encode2 = passwordEncoder.encode("123456");System.out.println("encode1: "+encode1);System.out.println("encode2: "+encode2);//第一个参数传入的是登录时候用户输入的密码,明文,然后和你数据库当中查到的加密后的密文比较:boolean flag1 = passwordEncoder.matches("123456",encode1);boolean flag2 = passwordEncoder.matches("123456",encode2);System.out.println("flag1为"+flag1);System.out.println("flag2为"+flag2);}}
LoginUser implements UserDetails:

到时候框架里面会调用loginUser的getPassword()方法来获取当前用户的密码之类的
 

                                

@Data
@AllArgsConstructor
@NoArgsConstructor
public class LoginUser implements UserDetails {private User user;@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return null;}@Overridepublic String getPassword() {return user.getPassword();}@Overridepublic String getUsername() {return user.getUserName();}@Overridepublic boolean isAccountNonExpired() {return false;}@Overridepublic boolean isAccountNonLocked() {return false;}@Overridepublic boolean isCredentialsNonExpired() {return false;}@Overridepublic boolean isEnabled() {return false;}
}

自定义登录接口:

相关文章:

SpringSecurity学习总结(三更草堂)

SpringSecurity安全框架的核心功能是认证和授权&#xff1a; 认证&#xff1a;验证当前访问系统的是不是本系统的用户&#xff0c;并且要确认具体是哪个用户。 授权&#xff1a;经过认证后判断当前用户是否具有进行某个操作的权限。 一般来说中大型的项目都是使用SpringSecurit…...

C++20中的jthread

一、多线程开发 c11以前&#xff0c;是不包含线程库的&#xff0c;开发多线程&#xff0c;必须使用OS系统自带的线程API&#xff0c;这就导致了很多问题&#xff0c;最主要的是&#xff0c;跨平台的开发&#xff0c;一般要保持几个主流应用的库的代码支持&#xff0c;特别是对…...

Xception模型详解

简介 Xception的名称源自于"Extreme Inception"&#xff0c;它是在Inception架构的基础上进行了扩展和改进。Inception架构是Google团队提出的一种经典的卷积神经网络架构&#xff0c;用于解决深度卷积神经网络中的计算和参数增长问题。 与Inception不同&#xff0…...

【合合TextIn】AI构建新质生产力,合合信息Embedding模型助力专业知识应用

目录 一、合合信息acge模型获MTEB中文榜单第一 二、MTEB与C-MTEB 三、Embedding模型的意义 四、合合信息acge模型 &#xff08;一&#xff09;acge模型特点 &#xff08;二&#xff09;acge模型功能 &#xff08;三&#xff09;acge模型优势 五、公司介绍 一、合合信息…...

Flutter 拦截系统键盘,显示自定义键盘

一、这里记录下在开发过程中&#xff0c;下单的时候输入金额需要使用自定义的数字键盘 参考链接: https://juejin.cn/post/7166046328609308685 效果图 二、屏蔽系统键盘 怎样才能够在输入框获取焦点的时候&#xff0c;不让系统键盘弹出呢&#xff1f;同时又显示我们自定义的…...

内存泄漏是什么?如何避免内存泄漏?

1.2 内存泄漏 使用new开辟空间泄漏&#xff0c;抛出异常 int main() {int size 0;try{while (1){//int* p (int*)malloc(sizeof(int) * 1024 * 1024);/*if (p NULL){break;}*/int* p new int[1024 * 1024];size size 4 * 1024 * 1024;cout << p << endl;}}…...

linux 中的syslog的含义和用法

在Linux系统中&#xff0c;syslog是一种系统日志服务&#xff0c;用于收集、存储和管理系统和应用程序生成的日志消息。syslog服务负责记录系统的运行状态、错误信息、警告、调试信息等&#xff0c;以便系统管理员可以监控系统的健康状况、故障排查和性能优化。 含义和作用&am…...

kubernetes(K8S)学习(一):K8S集群搭建(1 master 2 worker)

K8S集群搭建&#xff08;1 master 2 worker&#xff09; 一、环境资源准备1.1、版本统一1.2、k8s环境系统要求1.3、准备三台Centos7虚拟机 二、集群搭建2.1、更新yum&#xff0c;并安装依赖包2.2、安装Docker2.3、设置hostname&#xff0c;修改hosts文件2.4、设置k8s的系统要求…...

巧克力(蓝桥杯)

文章目录 巧克力题目描述解题分析贪心 巧克力 题目描述 小蓝很喜欢吃巧克力&#xff0c;他每天都要吃一块巧克力。 一天小蓝到超市想买一些巧克力。超市的货架上有很多种巧克力&#xff0c;每种巧克力有自己的价格、数量和剩余的保质期天数&#xff0c;小蓝只吃没过保质期的…...

Python爬虫之pyquery和parsel的使用

三、pyquery的使用 1、准备工作 pip3 install pyquery2、初始化 2.1、字符串初始化 把HTML的内容当做参数&#xff0c;来初始化PyQuery对象。 html <div><ul><li class"item-0">first item</li><li class"item-1">&l…...

移动硬盘怎么加密?移动硬盘加密软件有哪些?

移动硬盘是我们在工作中最常用的移动存储设备&#xff0c;为了保护数据安全&#xff0c;需要使用专业的移动硬盘加密软件加密保护。那么&#xff0c;移动硬盘加密软件有哪些&#xff1f; ​BitLocker BitLocker是Windows的磁盘加锁功能&#xff0c;可以用于加密保护移动硬盘中…...

openEuler 22.03 安装 .NET 8.0

openEuler 22.03 安装 .NET 8.0 openEuler 22.03 安装 .NET 8.0 openEuler 22.03 安装 .NET 8.0 查看内核信息 [jeffPC-20240314EIAA ~]$ cat /proc/version Linux version 5.15.146.1-microsoft-standard-WSL2 (root65c757a075e2) (gcc (GCC) 11.2.0, GNU ld (GNU Binutils)…...

【转载】OpenCV ECC图像对齐实现与代码演示(Python / C++源码)

发现一个有很多实践代码的git 库,特记录下: 地址:GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise 作者博客地址:https://blog.csdn.net/LuohenYJ 已关注。 Items项目Resources1age_gender1基于深度学习识别人脸性别和年龄Model2OpenCV_dlib_…...

每日一题(相交链表 )

欢迎大家来我们主页进行指导 LaNzikinh-CSDN博客 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节…...

C#WPF控件大全

本文列出WPF控件大全,点击可以进入详情页查看。 列表如下: AccessText用下划线来指定用作访问键的字符。 ActivatingKeyTipEventArgs为 ActivatingKeyTip 事件提供数据。...

好书推荐 《AIGC重塑金融》

作者&#xff1a;林建明 来源&#xff1a;IT 阅读排行榜 本文摘编自《AIGC 重塑金融&#xff1a;AI 大模型驱动的金融变革与实践》&#xff0c;机械工业出版社出版 这是最好的时代&#xff0c;也是最坏的时代。尽管大模型技术在金融领域具有巨大的应用潜力&#xff0c;但其应…...

【Linux】权限理解

权限理解 1. shell命令以及运行原理2. Linux权限的概念3. Linux权限管理3.1 文件访问者的分类&#xff08;人&#xff09;3.2 文件类型和访问权限&#xff08;事物属性&#xff09;3.2.1 文件类型3.2.2 基本权限 3.3 文件权限值的表示方法3.4 文件访问权限的相关设置方法3.4.1 …...

插入排序、归并排序、堆排序和快速排序的稳定性分析

插入排序、归并排序、堆排序和快速排序的稳定性分析 一、插入排序的稳定性二、归并排序的稳定性三、堆排序的稳定性四、快速排序的稳定性总结 在计算机科学中&#xff0c;排序是将一组数据按照特定顺序进行排列的过程。排序算法的效率和稳定性是评价其优劣的两个重要指标。稳定…...

【pytest、playwright】多账号同时操作

目录 方案实现思路&#xff1a; 方案一&#xff1a; 方案二&#xff1a; 方案实现思路&#xff1a; 依照上图所见&#xff0c;就知道&#xff0c;一个账号是pytest-playwright默认的环境&#xff0c;一个是 账号登录的环境 方案一&#xff1a; 直接上代码&#xff1a; imp…...

软考 系统架构设计师系列知识点之云原生架构设计理论与实践(8)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之云原生架构设计理论与实践&#xff08;7&#xff09; 所属章节&#xff1a; 第14章. 云原生架构设计理论与实践 第2节 云原生架构内涵 14.2 云原生架构内涵 关于云原生的定义有众多版本&#xff0c;对于云原生架构的…...

【C++】stack、queue和优先级队列

一、前言 二、stack类 2.1 了解stack 2.2 使用stack &#xff08;1&#xff09;empty &#xff08;2&#xff09;size &#xff08;3&#xff09;top &#xff08;4&#xff09;push &#xff08;5&#xff09;pop 2.3 stack的模拟实现 三、queue类 3.1 了解queue …...

第十三届蓝桥杯国赛真题 Java C 组【原卷】

文章目录 发现宝藏试题 A: 斐波那契与 7试题 B: 小蓝做实验试题 C: 取模试题 D: 内存空间试题 E \mathrm{E} E : 斐波那契数组试题 F: 最大公约数试题 G: 交通信号试题 I: 打折试题 J: 宝石收集 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#x…...

docker部署ubuntu

仓库&#xff1a; https://hub.docker.com/search?qUbuntu 拉一个Ubuntu镜像 docker pull ubuntu:18.04 查看本地镜像&#xff1a; docker images 运行容器 docker run -itd --name ubuntu-18-001 ubuntu:18.04 通过ps命令可以查看正在运行的容器信息 docker ps 进入容器 最…...

iOS问题记录 - App Store审核新政策:隐私清单 SDK签名(持续更新)

文章目录 前言开发环境问题描述问题分析1. 隐私清单 & SDK签名1.1. 隐私清单 - 数据使用声明1.2. 隐私清单 - 所用API原因描述1.3. SDK签名 2. 即将发布的第三方SDK要求 解决方案最后 前言 前段时间用Flutter开发的iOS App提交了新版本&#xff0c;结果刚过两分钟就收到了…...

ES学习日记(二)-------集群设置

上一节写了elasticsearch单节点安装和配置,现在说集群,简单地说就是在多台服务器上搭建单节点,在配置文件里面增加多个ip地址即可,过程同单节点部署,主要说集群配置 注意:不建议在之前单节点es上修改配置为集群,据说运行之后会生成很多文件,在单点基础上修改容易出现未知问题,…...

农村集中式生活污水分质处理及循环利用技术指南

立项单位&#xff1a;生态环境部土壤与农业农村生态环境监管技术中心、山东文远环保科技股份有限公司、北京易境创联环保有限公司、中国环境科学研究院、广东省环境科学研究院、中铁第五勘察设计院集团有限公司、中华环保联合会水环境治理专业委员会 本文件规定了集中式村镇生活…...

linux 一些命令

文章目录 linux 一些命令fdisk 磁盘分区parted 分区文件系统mkfs 格式化文件系统fsck 修复文件系统 mount 挂载swap 交换分区清除linux缓存df du 命令raid 命令基本原理硬raid 和 软raid案例raid 10 故障修复&#xff0c;重启与卸载 lvm逻辑卷技术LVM的使用方式LVM 常见名词解析…...

移动硬盘损坏打不开?别急,这里有解决方案!

在日常工作和生活中&#xff0c;移动硬盘几乎成为了我们必不可少的存储设备&#xff0c;它小巧便捷&#xff0c;能够容纳大量的数据。然而&#xff0c;当移动硬盘突然损坏打不开时&#xff0c;那份焦虑与无助几乎无法用言语来形容。那些重要的文件、珍贵的照片&#xff0c;似乎…...

微信小程序【从入门到精通】——服务器的数据交互

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…...

Python爬虫-懂车帝城市销量榜单

前言 本文是该专栏的第23篇,后面会持续分享python爬虫干货知识,记得关注。 最近粉丝留言咨询某汽车平台的汽车销量榜单数据,本文笔者以懂车帝平台为例,采集对应的城市汽车销量榜单数据。 具体的详细思路以及代码实现逻辑,跟着笔者直接往下看正文详细内容。(附带完整代码…...

设计网络网站/百度推广手机app下载

https://loj.ac/problem/515 题意&#xff1a;给出n个区间&#xff0c;然后从这些区间中取一个数&#xff0c;然后求将取出的数的平方相加得到的数的种类数。 思路&#xff1a;因为n <100,所以得出的数最大为1e6,.所以将得到的数放在bitset中。复杂度O(n ^ 2 *1e6/32)。按…...

wordpress 访问权限/百度浏览器网站入口

1.web容器&#xff1a;给处于其中的应用程序组件&#xff08;JSP&#xff0c;SERVLET&#xff09;提供一个环境&#xff0c;使JSP,SERVLET直接和容器中的环境变量接接口互&#xff0c;不必关注其它系统问题。主要有WEB服务器来实现。例如&#xff1a;TOMCAT,WEBLOGIC,WEBSPHERE…...

wordpress auto get rss/全网线报 实时更新

今天要跟大家分享的这本期刊可以说是非常的“大名鼎鼎”了。在它“人生”中最辉煌的时候&#xff0c;仅仅4年时间&#xff0c;影响因子就从2.875分升高到5.5分&#xff0c;属于生理学(2区)/细胞生物学(3区)。对于投稿者非常友好&#xff0c;收稿范围极广&#xff0c;和生理学沾…...

个人网站备案取名/搜索引擎优化公司

2008-05-07 14:24Provider 错误 80004005 未指定的错误 /asp/info/info.asp&#xff0c;行 36 关于这个错误有以下几种可能: 首先&#xff1a; temp权限问题找到C:\WINDOWS\temp 文件夹&#xff0c;因为打开数据库的时候要在temp里写入文件&#xff0c;如果权限不够的话&#x…...

wordpress 首页慢/app拉新一手渠道商

1.JAVA中的关键字: Java 关键字是区分大小写的哦&#xff01;所以 void 是关键字&#xff0c;但 Void 就不是了~~ 2.JAVA标识符: 标识符就是用于给 Java 程序中变量、类、方法等命名的符号。 使用标识符时&#xff0c;需要遵守几条规则&#xff1a; 1. 标识符可以由字母、数字…...

用flask做的网站有哪些/海淀区seo全面优化

来源&#xff1a;blog.csdn.net/qq_33840251/article/details/90482170单例bean与原型bean的区别1.画图分析2.源码分析单例bean的优势1.减少了新生成实例的消耗2.减少jvm垃圾回收3.可以快速获取到bean单例bean的劣势总结Spring 为啥把bean默认设计成单例&#xff1f;单例有啥劣…...