《系统单点登录解决方案.docx》由会员分享,可在线阅读,更多相关《系统单点登录解决方案.docx(20页珍藏版)》请在第一文库网上搜索。
1、单点登录解决方案1 .单点登录的背景与意义随着信息化建设的逐步深入,国家对信息化建设的要求越来越高,基于医疗信息化产品就应运而生,平台数据监控、基层卫生、综和管理等系统相继开发使用,多个系统之间想要实现一次登录即可使用所有系统功能成为了一种必然要求。我们公司产品在项目交付的过程中也遇到这种问题,一定程度上影响了项目的顺利验收。本次我就工作中处理的其他系统对接综管系统自动登录,形成解决方案,便于公司其他地方或大区综管项目验收时提供便利,保证项目顺利验收。2 .什么是单点登录2-1:概念单点登录的英文名叫做:Sing1eSignOn(简称SSO)o它的解释是:在多个应用系统中,只需要登录一次,就可
2、以访问其他相互信任的应用系统。如图所示,图中有4个系统,分别是APP1iCatiOn1、APP1iCatiOn2、APP1iCatiOn3、和SSOoApp1icationApp1ication2App1ication3没有登录模块,而SSO只有登录模块,没有其他的业务模块,当App1ication1App1ication2APPIiCatiOn3需要登录时,将跳到SSO系统,SSO系统完成登录,其他的应用系统也就随之登录了。这完全符合我们对单点登录(SSo)的定义。2-2:回顾单系统登录在我初学JaVaWeb的时候,登录和注册是我做得最多的一个功能了(初学SerVIet的时候做过、学SPri
3、ngMVC的时候做过、跟着做项目的时候做过),反正我也数不清我做了多少次登录和注册的功能了.这里简单讲述一下我们初学时是怎么做登录功能的。众所周知,HTTP是无状态的协议,这意味着服务器无法确认用户的信息C于是乎,W3C就提出了:给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie。如果说CookiC是检查用户身上的”通行证“来确认用户的身份,那么Session就是通过检查服务器上的”客户明细表“来确认用户的身份的。SeSSiOn相当于在服务器中建立了一份“客户明细表”。HTTP协议是无状态的,Session不能依据HT
4、TP连接来判断是否为同一个用户。于是乎:服务器向用户浏览器发送了一个名为JESS1oNID的Cookie,它的值是Session的id值。其实Session是依据Cookie来识别是否是同一个用户。所以,一般我们单系统实现登录会这样做:登录:将用户信息保存在SeSSion对象中如果在SeSSion对象中能查到,说明已经登录如果在SeSSion对象中查不到,说明没登录(或者已经退出了登录)注销(退出登录):从SeSSion中删除用户的信息记住我(关闭掉浏览器后,重新打开浏览器还能保持登录状态):配合Cookie来用/* 用户登陆* /POStMaPPing(Va1Ue=7usersession,
5、zproduces=app1ication/json;charset=UTF-8)pub1icResu1tIoginfStringmobi1eNo,Stringpassword,StringinputCaptcha,HttpSessionsession,HttpservIetResponseresponse)判断验证码是否正确if(WebUti1s.va1idateCaptcha(inputCaptcha,captcha,session)判断有没有该用户Useruser=UserService.user1ogin(mobi1eNo,password);if(user!=nu11)*设置自动登陆
6、,一个星期.将token保存在数据库中*/StringIoginToken=WebUtiIs.md5(newDate().toString()+session.get1d();Usenset1oginToken(IoginToken);Useruser1=UserService.user11p1oad(user);session.setAttribute(user,user1);CookieUtiI.addCookie(responsez1oginTokenJoginTokenz604800);returnResuItUtiI.success(user1);e1sereturnResu1tut
7、i1errorfResuItEnum1OGIN-ERROR);)e1sereturnResu1tUti1.error(Resu1tEnum.CAPTCHA_ERROR);)* 用户退出*/session,producesDeIeteMappingfvaIueapp1ication/json;charset=UTF-8)pub1icResu1tIogout(HttpSessior)SessionzHttpServIetRequestrequest,HttpservIetResponseresponse)删除session和cookiesession.removeAttribute(user);C
8、ookieUti1.c1earCookie(requestzresponse,IoginToken);returnResuItUtiI.success();)* version1.0* * 拦截器;实现自动登陆功能* /pub1icc1assUser1nterceptorimp1ementsHand1er1nterceptorAutowiredprivateUserServiceUserService;pub1icboo1eanpreHand1e(HttpServ1etRequestrequest,HttpservIetResponseresponse,Objecto)throwsExcept
9、ionUsersessionUser=(User)request.getSession().getAttribute(user);/已经登陆了,放行if(sessionUser!=nu11)returntrue;e1se得到带过来cookie是否存在StringIoginToken=CookieUti1findCOokieByName(request,IoginToken);if(Stnng11ti1sJsNotBIank(IoginToken)到数据库查询有没有该CookieUseruser=userService.findUserBy1oginToken(1oginToken);if(us
10、er!=nu11)request.getSession().setAttribute(user,user);returntrue;e1se没有该Cookie与之对应的用户(CoOkie不匹配)CookieUtiI.c1earCookie(request,response,IoginToken);returnfa1se;e1se没有cookie,也没有登陆。是index请求获取用户信息,可以放行if(request.getRequestURI().contains(session)returntrue;)没有cookie凭证response.sendRedirectC71ogin.htm1);r
11、eturnfa1se;)总结一下上面代码的思路:用户登录时,验证用户的账户和密码生成一个Token保存在数据库中,将Token写到Cookie中将用户数据保存在Session中请求时都会带上Cookie,检查有没有登录,如果已经登录则放行3,多系统登录的问题与解决可以将登录功能单独抽取出来,做成一个子系统。SSO(登录系统)的逻辑如下:/登录功能(SSO单独的服务)(S)Overridepub1icMsgResuIt1ogin(Stringusername,Stringpassword)throwsException根据用户名查询用户信息TbUserExampIeexamp1e=newTbUs
12、erExampIeO;Criteriacriteria=examp1e.createCriteria();criteria.andUsernameEqua1To(username);1ist1ist=UserMappense1ectByExampIetexampIe);if(nu11=1ist11IistJsEmptyO)returnMSgReSU1t.b31d(400,”用户不存在);)核对密码TbUseruser=1ist.get(O);if(!DigestUtiIs.md5DigestAsHe(password.getBytes().equa1s(user.getPassword()re
13、turnMSgReSU1t.bui1d(400,“密码错误);)登录成功,把用户信息写入redis生成一个用户tokenStringtoken=UUID.random11UID().toString();jedisC1uster.set(USER_TOKEN_KEY+:+token,JsonUtiIs.objectToJson(user);设置session过期时间jedisC1uster.expire(USER_TOKEN_KEY+:+token,SESSION_EXPIRE_TIME);returnMsgResuIt.ok(token);)其他子系统登录时,请求SSO(登录系统)进行登录,
14、将返回的token写到Cookie中,下次访问时则把Cookie带上:pub1icMsgResuIt1ogin(Stringusername,Stringpassword,HttpServIetRequestrequest,HttpservIetResponseresponse)请求参数Mapparam=newHashMap();param.put(usernamezusername);param.put(password,password);登录处理StringStringResuIt=HttpC1ientUti1.doPost(REGISTER_USER_UR1+USER_1OGIN_UR
15、1,param);MsgResuItresu1t=MsgResuItJormat(StringResuIt);登录出错if(resu1t.getStatus()!=200)returnresu1t;)登录成功后把取token信息,并写入CookieStringtoken=(String)resu1t.getData();写入cookieCookie11ti1s.setCookie(request,response,TT-TOKEN,token);返回成功returnresu1t;总结:SSO系统生成一个token,并将用户信息保存,并设置过期时间其他系统请求SSO系统进行登录,得到SSO返回的token,写到Cookie中每次请求时,CookiC都会带上,拦截器得到token,判断是否已经登录