您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 单点登陆概要设计_1
单点登录(SSO)服务详细设计说明1单点登陆需求单点登录(SingleSignOn),简称为SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。使用“单点登录”整合后,只需要登录一次就可以进入多个系统,而不需要重新登录,这不仅仅带来了更好的用户体验,更重要的是降低了安全的风险和管理的消耗2单点登陆的技术实现机制单点登录的机制,当用户第一次访问应用系统1(如下图)的时候,因为还没有登录,会被引导到认证系统中进行登录(1);根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,应该返回给用户一个认证的凭据--ticket(2);用户再访问别的应用的时候(3,5)就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行效验,检查ticket的合法性(4,6)。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。从上面的视图可以看出,要实现SSO,需要以下主要的功能:1.所有应用系统共享一个身份认证系统统一的认证系统是SSO的前提之一。认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行效验,判断其有效性。2.所有应用系统能够识别和提取ticket信息要实现SSO的功能,让用户只登录一次,就必须让应用系统能够识别已经登录过的用户。应用系统应该能对ticket进行识别和提取,通过与认证系统的通讯,能自动判断当前用户是否登录过,从而完成单点登录的功能。有两点需要指出的是:单一的用户信息数据库并不是必须的,有许多系统不能将所有的用户信息都集中存储,应该允许用户信息放置在不同的存储中,如下图所示。事实上,只要统一认证系统,统一ticket的产生和效验,无论用户信息存储在什么地方,都能实现单点登录。3WEB-SSO的实现在同一个应用中也需要保存用户的登录身份信息。例如用户在访问页面1的时候进行了登录,但护应用的状态。C是刚才也提到,客户端的每个请求都是单独的连接,当客户再次访问页面2的时候,如何才能告诉Web服务器,客户刚才已经登录过了呢?浏览器和服务器之间有约定:通过使用cookie技术来维ookie是可以被Web服务器设置的字符串,并且可以保存在浏览器中。如下图所示,当浏览器访问了页面1时,web服务器设置了一个cookie,并将这个cookie和页面1一起返回给浏览器,浏览器接到cookie之后,就会保存起来,在它访问页面2的时候会把这个cookie也带上,Web服务器接到请求时也能读出cookie的值,根据cookie值的内容就可以判断和恢复一些用户的信息状态。Web-SSO完全可以利用Cookie结束来完成用户登录信息的保存,将浏览器中的Cookie和上文中的Ticket结合起来,完成SSO的功能。3.2.1身份认证服务代码解析身份认证服务是一个标准的web应用,包括一个名为SSOAuth的Servlet,一个login.jsp文件和一个failed.html。身份认证的所有服务几乎都由SSOAuth的Servlet来实现了;login.jsp用来显示登录的页面(如果发现用户还没有登录过);failed.html是用来显示登录失败的信息(如果用户的用户名和密码与信息数据库中的不一样)。SSOAuth的代码如下面的列表显示,结构非常简单,先看看这个Servlet的主体部分:packageDesktopSSO;importjava.io.*;importjava.net.*;importjava.text.*;importjava.util.*;importjava.util.concurrent.*;importjavax.servlet.*;importjavax.servlet.http.*;publicclassSSOAuthextendsHttpServlet{staticprivateConcurrentMapaccounts;staticprivateConcurrentMapSSOIDs;Stringcookiename=WangYuDesktopSSOID;Stringdomainname;publicvoidinit(ServletConfigconfig)throwsServletException{super.init(config);domainname=config.getInitParameter(domainname);cookiename=config.getInitParameter(cookiename);SSOIDs=newConcurrentHashMap();accounts=newConcurrentHashMap();accounts.put(wangyu,wangyu);accounts.put(paul,paul);accounts.put(carol,carol);}protectedvoidprocessRequest(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{PrintWriterout=response.getWriter();Stringaction=request.getParameter(action);Stringresult=failed;if(action==null){handlerFromLogin(request,response);}elseif(action.equals(authcookie)){StringmyCookie=request.getParameter(cookiename);if(myCookie!=null)result=authCookie(myCookie);out.print(result);out.close();}elseif(action.equals(authuser)){result=authNameAndPasswd(request,response);out.print(result);out.close();}elseif(action.equals(logout)){StringmyCookie=request.getParameter(cookiename);logout(myCookie);out.close();}}.....}SSOAuth就是一个Servlet。其中有两个静态成员变量:accounts和SSOIDs,这两个成员变量都使用了JDK1.5中线程安全的MAP类:ConcurrentMap,所以这个样例一定要JDK1.5才能运行。Accounts用来存放用户的用户名和密码,在init()的方法中可以看到我给系统添加了三个合法的用户。在实际应用中,accounts应该是去数据库中或LDAP中获得,为了简单起见,在本样例中我使用了ConcurrentMap在内存中用程序创建了三个用户。而SSOIDs保存了在用户成功的登录后所产生的cookie和用户名的对应关系。它的功能显而易见:当用户成功登录以后,再次访问别的系统,为了鉴别这个用户请求所带的cookie的有效性,需要到SSOIDs中检查这样的映射关系是否存在。在主要的请求处理方法processRequest()中,可以很清楚的看到SSOAuth的所有功能如果用户还没有登录过,是第一次登录本系统,会被跳转到login.jsp页面(在后面会解释如何跳转)。用户在提供了用户名和密码以后,就会用handlerFromLogin()这个方法来验证。如果用户已经登录过本系统,再访问别的应用的时候,是不需要再次登录的。因为浏览器会将第一次登录时产生的cookie和请求一起发送。效验cookie的有效性是SSOAuth的主要功能之一。SSOAuth还能直接效验非login.jsp页面过来的用户名和密码的效验请求。这个功能是用于非web应用的SSO,这在后面的桌面SSO中会用到。SSOAuth还提供logout服务。下面看看几个主要的功能函数:privatevoidhandlerFromLogin(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringusername=request.getParameter(username);Stringpassword=request.getParameter(password);Stringpass=(String)accounts.get(username);if((pass==null)||(!pass.equals(password)))getServletContext().getRequestDispatcher(/failed.html).forward(request,response);else{StringgotoURL=request.getParameter(goto);StringnewID=createUID();SSOIDs.put(newID,username);Cookiewangyu=newCookie(cookiename,newID);wangyu.setDomain(domainname);wangyu.setMaxAge(60000);wangyu.setValue(newID);wangyu.setPath(/);response.addCookie(wangyu);System.out.println(loginsuccess,gotobackurl:+gotoURL);if(gotoURL!=null){PrintWriterout=response.getWriter();response.sendRedirect(gotoURL);out.close();}}}handlerFromLogin()这个方法是用来处理来自login.jsp的登录请求。它的逻辑很简单:将用户输入的用户名和密码与预先设定好的用户集合(存放在accounts中)相比较,如果用户名或密码不匹配的话,则返回登录失败的页面(failed.html),如果登录成功的话,需要为用户当前的session创建一个新的ID,并将这个ID和用户名的映射关系存放到SSOIDs中,最后还要将这个ID设置为浏览器能够保存的cookie值。登录成功后,浏览器会到哪个页面呢?那我们回顾一下我们是如何使用身份认证服务的。一般来说我们不会直接访问身份服务的任何URL,包括login.jsp。身份服务是用来保护其他应用服务的,用户一般在访问一个受SSOAuth保护的Web应用的某个URL时,当前这个应用会发现当前的用户还没有登录,便强制将也页面转向SSOAuth的login.jsp,让用户登录。如果登录成功后,应该自动的将用户的浏览器指向用户最初想访问的那个URL。在handlerFromLogin()这个方法中,我们通过接收“goto”这个参数来保存用户最初访问的URL,成功后便重新定向到这个页面中。另外一个要说明的是,在设置cookie的时候,我使用了一个setMaxAge(6000)的方法。这个方法是用来设置cookie的有效期,单位是秒。如果不使用这个方法或者参数为负数的话,当浏览器关闭的时候,这个cookie就失效了。在这里我给了很大的值(1000分钟),导致的行为是:当你关闭浏览器(或者关机),下次再打开浏览器访问刚才的应用,只要在1000分钟之内,就不需要再登录了3.2.2具有SSO功能的web应用源代码解析要实现WEB-SSO的功能,只有身份认证
本文标题:单点登陆概要设计_1
链接地址:https://www.777doc.com/doc-3370796 .html