001 Security概述
1.Spring Security概述
Spring Security是用于解决认证与授权的框架
- SpringSecurity默认要求所有的请求都是必须先登录才允许的访问
BCrypt加密算法
BCrypt优秀的加密算法工具,不可逆算法,类似于MD5
传输过程加密: 加密->解密
存储结果加密
2.Session机制和Token机制
Session: SessionID (UUID)验证机制,不可共享,
Token: 票据验证机制 JWT
### 2.1 JWT(**J**son **W**eb **T**oken)
2.1.1 JWT组成
JWT的组成部分:Header(头),Payload(载荷),Signature(签名)
// Header:指定算法与当前数据类型
// 格式为: { "alg": 算法, "typ": "jwt" }
.setHeaderParam(Header.CONTENT_TYPE, "HS256")
.setHeaderParam(Header.TYPE, Header.JWT_TYPE)
// Payload:通常包含Claims(自定义数据)和过期时间
.setClaims(claims)
.setExpiration(new Date(System.currentTimeMillis() + 5 * 60 * 1000))
// Signature:由算法和密钥(secret key)这2部分组成
.signWith(SignatureAlgorithm.HS256, secretKey)
// 打包生成
.compact();
2.1.2 JWT解析
String jwt = "eyJjdHkiOiJIUzI1NiIsInR5cCI6IkpXVCIsImFsZyI6IkhTMjU2In0.eyJuYW1lIjoi5pyI5LquIiwiaWQiOjk1MjcsImV4cCI6MTY1NTcxMTYwN30.6r491chs36tklI3LZnABAsOLoAOr-wIosKrElOS8-kg";
Claims claims = Jwts.parser()
.setSigningKey(secretKey).parseClaimsJws(jwt).getBody();
Object id = claims.get("id");
Object name = claims.get("name");
System.out.println("id = " + id);
System.out.println("name = " + name);
2.2 重点: Spring Security的大致实现流程
当通过以上URL进行访问时,其内部过程大概是:
- Spring Security的相关配置会进行URL的检查,来判断是否允许访问此路径
- 所以,需要在SecurityConfiguration中将以上路径设置为白名单
- 如果没有将以上路径配置到白名单,将直接跳转到登录页,因为默认所有请求都必须先登录
- 由AdminController接收到请求后,调用了IAdminService接口的实现类对象来处理登录
- IAdminService接口的实现是AdminServiceImpl
- 在AdminServiceImpl中,调用了AuthenticationManager处理登录的认证
- AuthenticationManager对象调用authenticate()方法进行登录处理
- 内部实现中,会自动调用UserDetailsService实现对象的loadUserByUsername()方法以获取用户信息,并自动完成后续的认证处理(例如验证密码是否正确),所以,在步骤中,具体执行的是UserDetailsServiceImpl类中重写的方法,此方法返回了用户信息,Spring Security自动验证,如果失败(例如账号已禁用、密码错误等),会抛出异常
- 以上调用的authenticate()方法如果未抛出异常,可视为认证成功,即登录成功
- 当登录成功时,应该返回此用户的JWT数据(暂时未实现)
- AuthenticationManager对象调用authenticate()方法进行登录处理
拓展:
resultMap与resultType
resultMap是指导Mybatis对查询结果的封装
resultType: 在添加驼峰配置的前提下可以适用用单表查询方便
001 Security概述的更多相关文章
- 001.CDN概述
一 互联网应用质量概述 1.1 互联网应用质量 互联网应用质量指标--QoE,其主要指标: 服务成功率:指用户所请求的服务成功完成的几率. 服务建立时间:指从服务请求到服务呈现所花费的时间,并且会因为 ...
- 【java基础学习001】概述
001.1 一个简单的Java程序 public class hello { public static void main(String[] args) { System.out.printl ...
- 李洪强漫谈iOS开发[C语言-001]-开发概述
- 001.ActiveMQ概述
1. 概念 ActiveMQ是Apache推出的,一款开源的,完全支持JMS1.1和J2EE1.4规范的JMS Provider实现的消息中间件(Message Oriented Middleware ...
- Java Part 001( 01_01_Java概述 )
Java作为编程语言, 甚至超出了语言的范畴, 成为一种开发平台, 一种开发规范. Java语言相关的JavaEE规范里, 包含了时下最流行的各种软件工程理念, 学习Java相当于系统的学习了软件开发 ...
- Spring----->projects----->Spring Security
1.Spring Security概述 Spring Security是spring社区若干projects中的一个 Spring Security用于为基于spring开发的application提 ...
- Hadoop源码解析之: HBase Security
文不打算对这部分代码进行全面的解读,而是先对几个主要类的职能进行概述,然后再罗列一些有价值的重要细节. 第一部分:HBase Security 概述 HBase Security主要是基于User和U ...
- spring security 权限安全认证框架-入门(一)
spring security 概述: Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架.它是保护基于spring的应用程序的实际标准. Spring Security ...
- Spring Security实现OAuth2.0授权服务 - 基础版
一.OAuth2.0协议 1.OAuth2.0概述 OAuth2.0是一个关于授权的开放网络协议. 该协议在第三方应用与服务提供平台之间设置了一个授权层.第三方应用需要服务资源时,并不是直接使用用户帐 ...
随机推荐
- [笔记] 后缀自动机 (SAM)
实现 void ins(int c){ int np = ++dcnt, p = lst; lst = np; t[np].len = t[p].len + 1, t[np].eps = 1; whi ...
- 使用Visual Studio 2022开发前端
前端开发环境多数基于Node.js,好处不多说了.但与使用Visual Studio开发的后端Asp.Net Core项目一起调试,却不是很方便,所以试着在Visual Studio 2022中开发前 ...
- Linux磁盘和文件系统知识总结
硬盘操作 为什么要给硬盘分区? 如果你需要在一块硬盘上用到多个文件系统,那么你就需要对硬盘进行分区,以便用不同的分区支持不同的文件系统.(但一个硬盘只能有一个分区表!)反过来说,如果你整块硬盘都用同样 ...
- Flask框架实现登录注册功能(mysql数据库)
前言: 本例使用Flask框架完成登录和注册操作,包括前端(index.html,regist.html)和后端(app.py)两部分,前端页面不过多介绍,直接进入后端部分: 逻辑思路: 登录部分:运 ...
- 2020级cpp机考模拟题A卷-#题解1
为了各位朋友的身心健康(不是),我们按照题目难度顺序来写题解. 第一次写题解,希望多点包容和鼓励(恬不知耻 1:谁先输出-4 题意: 输入3个整数,按从大到小的顺序输出,每两个数字间加一个空格. 题解 ...
- coding++: java 操作FastDFS(上传 | 下载 | 删除)
package cn.com.soundrecording.controller; import cn.com.soundrecording.utils.FastDFSClient;import co ...
- TL,你是如何管理项目风险的?
沙包和打伞的故事 美国在1961年到1972年组织实施的一系列载人登月飞行任务.目的是实现载人登月飞行和人对月球的实地考察,为载人行星飞行和探测进行技术准备,它是世界航天史上具有划时代意义的一项成就. ...
- 写Selenium代码时一些技巧
本文地址: https://www.cnblogs.com/hchengmx/p/10880002.html 1. Chrome插件之"CSS Selector Helper for Chr ...
- Acwing 428
可以找到规律,将第 N 项的 N 对应的二进制表示,转换为以 k 为基底的数即可. N=1=1 ----> 1 ----> \(a^b\) N=2=2 ----> 10 ----&g ...
- 【高并发】通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程
核心逻辑概述 ThreadPoolExecutor是Java线程池中最核心的类之一,它能够保证线程池按照正常的业务逻辑执行任务,并通过原子方式更新线程池每个阶段的状态. ThreadPoolExecu ...