单点登录的解决思路

有个问题 我以前一直弄不清楚 那就是 在登录第一个系统之后 如何登录第二个系统
我以为是通过超链接进去的 但是看了那么多的资料 又觉得 应该是在地址栏直接输地址进去的
可是这样新的问题就来了 登录第二个系统的时候 如何知道第一个系统已经登录了 靠什么传输一个标志
这个问题 我到目前为止想到 两种解决方案
1. 使用response的sendredirect的方法
使用这个方法 服务器端接收的方式一定是get 而且这个方法 不能带太多的参数
这个方法的妙处就在于 使用这个方法后 是浏览器自己重新再次发送了一次请求
这不是重点 重点是:
如果之前有发过请求,那么再次发送的时候 浏览器会自己把cookie带上 对的这种实现单点登录的核心就是这个方法 间接 的利用浏览器 保存会话的标志从而实现单点登录
但是这样的做的问题就是
如果浏览器你的数据被你清除过,那么 这种方法 就不奏效了 不过鉴于这种情况应该不会发生 浏览器清除数据 一般都是退出后 没有人会在使用的时候删掉的。
-******
这里我还想补充一点 :网上还有一种解决思路 就是域名保持一致 但是这样会因为语言不同 web服务器不同造成差异 比如说tomcat是jsessionid 其他的是什么的
看到这个问题 我觉得的有点搞笑 感觉写博客的人 可能没有搞过这个 只是随便的复制黏贴别人的东西 这里cookie的name和value都是可以在后台指定的,不一定非要使用默认的啊
******我就是皮一下 或许还有其他的问题 我也是最近开始搞这一块的东西


2. 不使用跳转机制 直接访问服务,只是把请求的路径作为参数发送给sso服务器,还是返回一个token
但是浏览器这样会话的标志如何解决?
我想了一个解决的方案:
多系统之间有一个信任区 在这个区里面 只要登录了一个 那么另外几个也是 可以访问的 这个时候 客户端先是本地判断用户未登录,然后将实际的访问路径作为参数发送到 sso服务器 服务器根据请求路径 和请求信息的ip什么的(主要是用这些信息定位是哪台机器 用什么浏览器发出的,如果在再粗略一点 直接定位是哪个ip发出的),之后根据请请求路径确定 要访问的是哪个信任区 在这个信任区下是否 发出该请求的用户有登陆过 如果有那就直接放行 如果没有 那就让他登录
下面举个例子说明这种解决方案
我们这里有 系统1 系统2 系统3 这三个系统互相信任 还有另外一个 sso服务器

现在有一个用户的ip是 153.152.85.20
假设他 通过浏览器
登录了系统1 正常的登录流程 且登录成功
现在要访问系统2
系统2拦截请求 发现没有登录 将访问路径作为参数 去sso服务器去做验证
sso根据请求判断该用户的ip是什么 以及该请求所在的信任区 去信任区下寻找 是否该ip下的用户(这里不一定要用ip 主要是可以标识这个请求来自哪里就可以了)是否已经登陆过了 找到就返回对应的信息 这里发现他登陆过系统1 所以直接放行

这里是一种解决方案 还有更加细致的权限管理 临时会话什么的

总结下:
单点登录最大的问题 在于第二个或者说后面的系统如何知道这台机器下 (这个浏览器下) 这个用户已经登录 不用再登陆了,处理了这个问题 后面的权限管理 临时会话什么的就好解决了
目前解决单点登录的产品
spring-session
cas apache一个开源产品 很细致 不过也很复杂 分为客户端和服务端 要使用ssh密码什么的 比较复杂 我之前弄过 不过成了一般

对于问题的话还是要先搞清楚怎么做 怎么解决才是最好的








猜你喜欢

转载自blog.csdn.net/zhaoyu_nb/article/details/80639947
今日推荐