一、单点登录三种常见方法:
第一种: session广播机制实现(已过时)
session赋值 = 把登录的session对象,复制给其他模块
缺点:如果模块多的话,session复制会造成资源浪费,还会因为session复制导致数据重复
第二种:使用cookie + redis 实现(不太常用)
1、介绍
2、怎么设置过期时间?:使用redis 可以设置过期时间
3、概述、
4、原理
5、使用
利用SpringSession来实现session共享 http://t.csdn.cn/5pLqs
第三种:使用token实现(常用)
怎么设置过期时间:token可以设置过期时间
二、JWT
token是什么?按照一定规则生成的字符串,字符串可以包含用户信息。
什么是JWT? jwt就是token的一种官方规则
一种约定好生成字符串的规则
jwt就是生成字符串的一种实现
JWT的组成?
头部:主要设置一些规范信息,签名部分的编码格式就在头部中声明。
载荷:token中存放有效信息的部分,比如用户名,用户角色,过期时间等,但是不要放密码会泄露!
签名:将头部与载荷分别采用base64编码后,用“.”相连,再加入盐,最后使用头部声明的编码类型进行编码,就得到了签名。
(头部声明编码)【 [头部(base64) + "." + 荷载(base64)] , 盐(秘钥)】 = > 签名
什么是jjwt?
JJWT是一个提供端到端的JWT创建和验证的Java库。永远免费和开源(Apache License,版本2.0),JJW很容易使用和理解。它被设计成一个以建筑为中心的流畅界面,隐藏了它的大部分复杂性。
三、登陆流程
四、OAuth2(解决方案)
例如:微信登录、QQ登录、Gitee等社交登录,利用的就是OAuth
1、OAuth2 和 jwt 的区分?
OAuth2 是针对特定问题的一种方案,比如去北京,去北京是一种方案,而jwt是怎么去的,比如乘坐火车。
2、OAuth2 是什么?
OAuth2是针对特定问题一种解决方案。
3、OAuth2 主要可以解决什么问题?
(1)开放系统间授权
打印照片的权限:百度网盘 访问 打印照片 的权限
原理分析:
三种常见的授权方式:
方式一:用户名密码复制
(Lucy把百度网盘的用户名和密码给打印照片服务)
方式二:通用开发者key
(百度网盘和打印照片开发一种万能钥匙,用于二者的访问)
方式三:办法令牌(在方式二上进一步的完善)
(百度网盘颁发一种令牌,用于访问百度网盘)
(2)分布式访问问题(单点登录)
五、springsecurity
概念:
Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架,提供了一套Web 应用安全性的完整解决方案。一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。
(1)用户认证指的是:验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。
(2)用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。
Spring Security其实就是用filter,多请求的路径进行过滤。
(1)如果是基于Session,那么Spring-security会对cookie里的sessionid进行解析,找到服务器存储的sesion信息,然后判断当前用户是否符合请求的要求。
(2)如果是token,则是解析出token,然后将当前请求加入到Spring-security管理的权限信息中去
认证与授权实现思路
如果系统的模块众多,每个模块都需要就行授权与认证,所以我们选择基于token的形式进行授权与认证,用户根据用户名密码认证成功,然后获取当前用户角色的一系列权限值,并以用户名为key,权限列表为value的形式存入redis缓存中,根据用户名相关信息生成token返回,浏览器将token记录到cookie中,每次调用api接口都默认将token携带到header请求头中,Spring-security解析header头获取token信息,解析token获取当前用户名,根据用户名就可以从redis中获取权限列表,这样Spring-security就能够判断当前请求是否有权限访问。