SSO单点登陆

原创 tigon  2020-07-31 09:31:42  阅读 141 次 评论 0 条

1、单点登录实现原理
1)登录

注意:
1)跳转SSO验证登录时,需要使用sendDirect重定向;
2)浏览器与SSO之间建立的会话成为全局会话。
扩展:
a.spring项目如何获取本机的IP地址?

获得仅为ip地址不带端口
b.spring项目如何获取项目端口?

2)注销

SSO认证中心有一个全局会话的监听器,一旦全局会话注销,将通知所有注册系统注销

扩展知识:
Shiro的退出操作为:

3)部署

2、 Shiro的多Rrealm配置
1)第一步:设置登录类型标识;
2)第二步:新建org.apache.shiro.authc.UsernamePasswordToken的子类;
3)第三步:新建org.apache.shiro.authc.pam.ModularRealmAuthenticator的子类(自定义认证器);
4)第四步:定义不同的realm;
5)第五步:进行shiro的相关配置,包括配置自定义认证器(认证策略)、配置多个reaml到securitymanager。
相关的配置:
XML配置:https://blog.csdn.net/xiangwanpeng/article/details/54802509
SpringBoot集成:https://blog.csdn.net/cckevincyh/article/details/79629022

3、Shiro内置过滤器

4、Shiro整合SSO单点登录系统
参考链接:https://blog.csdn.net/m0_37797991/article/details/78529096
主要逻辑:
1)各自项目通过shiro进行登录认证;
2)自定义Filter并配置到securityManager中,所有请求必须通过此Filter;
3)Filter主要逻辑:
a.获取参数中的Token值,若不存在查看Cookie中是否存在;
b.如果都不存在Token值,重定向SSO认证服务地址进行登录操作;
c.如果Token存在,检查是否为退出操作;
d.如果是退出操作,首先清除缓存中的登录信息以及用户的登录操作,然后向SSO认证中心进行退出操作,由SSO认证中心通知所有服务下线,之后跳转到SSO的登录页面;
e.如果不是退出操作,去SSO验证Token的有效性;
f.如果验证无效,重定向至SSO认证服务地址进行登录操作;
g.如果验证有效,则SSO返回登录用户的信息,服务端将其存储,并将Token设置到Cookie中。
h.shiro的reaml中,登录校验为形式,用户信息从刚才的缓存中取用,同时密码设置为常量。

补充:
1)请求中的Token值为SSO认证中心生成,生成方式可以使用JWT(JSON Web Token)工具,也可以使用UUID。
JWT方式:

UUID:

2)Spring获取Coolie工具类
参考链接:https://www.cnblogs.com/EasonJim/p/7721950.html

3)Shiro踢出已登录的用户

4)登录失败超过一定次数如何锁定帐号?(Shiro)
参考链接:https://mp.weixin.qq.com/s/CasK9RvR_MrWvLaVMoZbMw

5、Shiro会话管理相关
参考链接:https://blog.csdn.net/ljxbbss/article/details/77771001
相关的类,便于使用:
1)使用会话
从当前的Subject中获取会话。

2)会话管理器
SessionManager管理所有Subject的session包括创建、维护、删除、失效、验证等工作。SessionManager是顶层组件,由SecurityManager管理。
SecurityManager的实现类DefaultSecurityManager及DefaultWebSecurityManager继承了SessionsSecurityManager。
SessionsSecurityManager可以把相应的会话管理委托给SessionManager。
例如SessionsSecurityManager中的代码

3)会话监听
要写自己的监听器,需要实现 SessionListener 接口。

4)会话存储/持久化
Session可以存储在内存或者各种数据库中。SessionManager委托SeesionDao对session进行增删改查。可以为SessionManager配置SessionDao。
a.EHCache SessionDAO;
b.Session ID生成器
在每次创建session时,SessionDAO都会使用 SessionIdGenerator生成一个新的session ID, SessionIdGenerator默认实现是JavaUuidSessionIdGenerator,也就是生成UUID。可以自定义自己的SessionIdGenerator。
SessionDao接口定义了以下方法。

5)会话验证
默认的 SessionValidationScheduler调度器实现是 ExecutorServiceSessionValidationScheduler (基于JDKScheduledExecutorService实现的)。默认的调度周期是1小时,也就是没小时都会执行一次session验证,并清除过期或无效的session。

6、结合shiro-redis的jar实现redis的会话管理:
参考链接:https://blog.csdn.net/qq_34021712/article/details/80774649
Shiro用redis实现缓存需要重写cache、cacheManager、SessionDAO和初始化redis配置。

0

本文地址:https://webge.net/?id=89
版权声明:本文为原创文章,版权归 tigon 所有,欢迎分享本文,转载请保留出处!

评论已关闭!