在看
星标
留言,真爱
来自:ywlaker
责编:乐乐
回复“”,获取一份专属大礼包
链接:cnblogs.
sso-server
1、验证用户的登录信息;2、创建全局会话;3、创建授权令牌;4、与sso-client通信发送令牌;5、校验sso-client令牌有效性;6、系统注册;7、接收sso-client注销请求,注销所有会话。
接下来,我们按照原理来一步步实现sso吧!
1、sso-client拦截未登录请求
java拦截请求的方式有servlet、filter、listener三种方式,我们采用filter。在sso-client中新建LoginFilter.java类并实现Filter接口,在doFilter()方法中加入对未登录用户的拦截。
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{HttpServletRequestreq=(HttpServletRequest)request;HttpServletResponseres=(HttpServletResponse)response;HttpSessionsession=req.getSession();if(session.getAttribute("isLogin")){chain.doFilter(request,response);return;}//跳转至sso认证中心res.sendRedirect("sso-server-url-with-system-url");}
2、sso-server拦截未登录请求
拦截从sso-client跳转至sso认证中心的未登录请求,跳转至登录页面,这个过程与sso-client完全一样。
3、sso-server验证用户登录信息
用户在登录页面输入用户名密码,请求登录,sso认证中心校验用户信息,校验成功,将会话状态标记为“已登录”
RequestMapping("/login")publicStringlogin(Stringusername,Stringpassword,HttpServletRequestreq){this.checkLoginInfo(username,password);req.getSession().setAttribute("isLogin",true);return"success";}4、sso-server创建授权令牌
授权令牌是一串随机字符,以什么样的方式生成都没有关系,只要不重复、不易伪造即可,下面是一个例子
Stringtoken=UUID.randomUUID().toString();
5、sso-client取得令牌并校验
sso认证中心登录后,跳转回子系统并附上令牌,子系统(sso-client)取得令牌,然后去sso认证中心校验,在LoginFilter.java的doFilter()中添加几行
//请求附带token参数Stringtoken=req.getParameter("token");if(token!=null){//去sso认证中心校验tokenbooleanverifyResult=this.verify("sso-server-verify-url",token);if(!verifyResult){res.sendRedirect("sso-server-url");return;}chain.doFilter(request,response);}
verify()方法使用