标题:
单点登录原理与简单实现(7)
[打印本页]
作者:
look_w
时间:
2019-1-17 20:24
标题:
单点登录原理与简单实现(7)
3、sso-server验证用户登录信息
用户在登录页面输入用户名密码,请求登录,sso认证中心校验用户信息,校验成功,将会话状态标记为“已登录”
[url=]
[/url]
@RequestMapping("/login"
)
public
String login(String username, String password, HttpServletRequest req) {
this
.checkLoginInfo(username, password); req.getSession().setAttribute(
"isLogin",
true
);
return
"success"
;}
[url=]
[/url]
4、sso-server创建授权令牌
授权令牌是一串随机字符,以什么样的方式生成都没有关系,只要不重复、不易伪造即可,下面是一个例子
String token = UUID.randomUUID().toString();
5、sso-client取得令牌并校验
sso认证中心登录后,跳转回子系统并附上令牌,子系统(sso-client)取得令牌,然后去sso认证中心校验,在LoginFilter.java的doFilter()中添加几行
[url=]
[/url]
//
请求附带token参数
String token = req.getParameter("token"
);
if
(token !=
null
) {
//
去sso认证中心校验token
boolean
verifyResult =
this
.verify("sso-server-verify-url"
, token);
if
(!
verifyResult) { res.sendRedirect(
"sso-server-url"
);
return
; } chain.doFilter(request, response);}
[url=]
[/url]
verify()方法使用httpClient实现,这里仅简略介绍,httpClient详细使用方法请参考官方文档
HttpPost httpPost =
new
HttpPost("sso-server-verify-url-with-token"
);HttpResponse httpResponse
= httpClient.execute(httpPost);
6、sso-server接收并处理校验令牌请求
用户在sso认证中心登录成功后,sso-server创建授权令牌并存储该令牌,所以,sso-server对令牌的校验就是去查找这个令牌是否存在以及是否过期,令牌校验成功后sso-server将发送校验请求的系统注册到sso认证中心(就是存储起来的意思)
令牌与注册系统地址通常存储在key-value数据库(如redis)中,redis可以为key设置有效时间也就是令牌的有效期。redis运行在内存中,速度非常快,正好sso-server不需要持久化任何数据。
令牌与注册系统地址可以用下图描述的结构存储在redis中,可能你会问,为什么要存储这些系统的地址?如果不存储,注销的时候就麻烦了,用户向sso认证中心提交注销请求,sso认证中心注销全局会话,但不知道哪些系统用此全局会话建立了自己的局部会话,也不知道要向哪些子系统发送注销请求注销局部会话
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0