shiro单点登录跨域问题。

DanieLong 发布于 2018/12/18 20:50
阅读 828
收藏 2

我最近遇到了一个问题,公司有多个子系统,现在我在开发一个sso单点登录系统,用的shiro框架。A系统是统一登录平台,登录A系统后,通过权限列表生成左边资源列表,对应着其余子系统,右边页面内嵌iframe指向B、C、D子系统,通过点击资源列表,对子系统内容进行操作,A、B、C、D子系统均使用一样的shiro框架,通过redis管理session,现在A系统登录后生成cookie和session信息。但是,在点击资源列表时,由于B没有A的cookie,B端进行权限交验后,iframe里的页面跳转至登录页面了。请问各位大神,有没有什么办法把A的cookie传给B,希望各位提供一下思路,最好给我说一下怎么操作shiro的SessionManager,或者是filter,在此多谢了!!!

加载中
0
嘵建
嘵建

你这样没有用到单点登录吧,点B时应该也请求A吧?

DanieLong
DanieLong
看清楚问题
0
红薯官方
红薯官方

用户在前台操作,系统它们之间在后台偷偷传递授权和确认数据,用户截取不到也安全。

而不是通过客户端来暴力取 SessionId 的 Cookie,如果知道 HttpOnly ,SessionId 这个 Coolie 应该要被设置为 HttpOnly 禁止Javascript读取的。

我自己实现过的一套流程,A系统认证绑定B系统的用户,提供快捷登陆B系统的功能:

用户X在A系统浏览器端请求接口1要求登陆到系统B,A系统检测到用户X还没有登陆到B系统的认证密钥R,于是A系统产生 TOKEN 1,让用户X的浏览器跳转页面到B系统登陆绑定接口,B系统在后台使用该TOKEN 1 直接跟 系统A 进行确认验证TOKEN 1是不是A系统合法的TOKEN。如果是则A系统会告知B系统此TOKEN对应的A系统用户名X和认证密钥(如没有则为空)。

B系统在验证TOKEN 1合法之后,检查A系统返回的用户名X和认证密钥R是否存在、是否和自己存储的密钥一致,如果一致则取出里面B系统已被绑定的用户信息,调用SecurityUtils.getSubject().login(username, password)进行登录,并且跳转到b/home.jsp!

B系统检测如果TOKEN1合法,且A系统返回的用户名X和认证密钥不存在,那么则让用户X浏览器跳转到登录绑定页面,验证用户X在B系统的用户名密码和其他必要的信息。

在用户X绑定到B系统的过程中,B系统首先要验证用户输入的B系统的用户信息的正确性,验证通过之后,则在后台调用A系统,将TOKEN1和新产生的TOKEN2、A系统用户名、B系统用户名返回给A系统。

A系统对TOKEN1和A系统用户名进行校验,正确之后则存储TOKEN2(替换1)和B系统用户名,TOKEN1不合法则返回认证失败给B系统,B系统通知用户认证失败。

下次用户X再通过A系统请求快捷进入B系统时,A系统将使用TOKEN2和B系统做认证用户X,用户X可以快捷的登陆到B系统。

这种办法是服务器之间双向认证证明是自己人,用户无法抵赖,两个系统之间不需要交换用户的密码,可以支持用户一对一的任意绑定。

如果只是部署一套,则上面的流程允许A系统用户快捷登陆到B系统,而B系统用户则无法快捷的登陆A系统。

DanieLong
DanieLong
你这个有点复杂了,我已经用url重定向实现了cookie共享,解决了跨域的问题
0
逗逼

A B C D 如果是同域名下的话 还是可以做到cookie共享的吧。

DanieLong
DanieLong
关键就是跨域的,同域的不存在难度
返回顶部
顶部