SSO单点登陆
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
版权声明:本文由Web学习之路发布,如需转载请注明出处。