|
锁定老贴子 主题:[原创]网络认证中心开发心得!
该帖已经被评为精华帖
|
|
|---|---|
| 作者 | 正文 |
|
时间:2005-03-20
一.目的: 在多个运行的系统中,只登录一次,就能运用各种系统,而不需再次登录,也就是开发一个网页通行证.
二.目标: 1.实现跨域,也就是不能用COOKIE来实现,2.好的安全性,也就是不能用JAVASCRIPT来实现自动登录.3.通用性,也就不能依赖于各种JSP服务程序,所以不能用RESIN的共享SSSION的方法实现,也不能用和其它JSP服务程序有关的方法实现. 三.思路:1.程序构架用STRUTS+SPRING+HIBERNATE实现.2.用hessian分布式技术实现登录信息的远程传输.3.用STRUTS的MVC优点,为要认证的程序制作两个认证模块,一个是本机认证,一个是远程认证,通过STRUTS-CONFIG.XML配置修改实现两种认证模式的转换. 四.实现方法: 把所有的认证SESSION认证信息集中在认证中心,其它程序需要认证时,通过分布式技术传输认证中心的SESSION信息. 五.部份代码: 1.远程认证接口: [code:1] package remote.passCenter.service; import java.util.*; import common.spring.dao.*; import remote.passCenter.pojo.*; import remote.passCenter.web.SessionBean; /** * <p>Title: 分布式,远程调用</p> * * <p>Description: </p> * * <p>Copyright: Copyright (c) 2004</p> * * <p>Company: </p> * * @author 段洪杰 * @version 1.0 */ public interface IFacadeRemoteService { /** * 检查是否已登录 * @param sid String * @return boolean * @throws FacadeRemoteServiceException */ public boolean check(String sid) throws FacadeRemoteServiceException; /** * 录入新的Session. * 当原来有同名registerName时,删掉原来的Session,用新的代替. * 返回ID,当返回的ID为NULL是,存SESSION失败! * @param session Session * @return String */ public String setSession(Session session) throws FacadeRemoteServiceException; /** * 从清除session. * @param sid String * @throws FacadeRemoteServiceException */ public void removeSession(String sid) throws FacadeRemoteServiceException ; /** * 刷新session中的时间为当前时间 * @param sid String * @throws FacadeRemoteServiceException */ public void flushTime(String sid) throws FacadeRemoteServiceException ; /** * 将hour个小时以前登录入的session清除 * @param hour int * @throws FacadeRemoteServiceException */ public void flushSession() throws FacadeRemoteServiceException; ///// public void setBaseDAO(IBaseDAO baseDAO); public IBaseDAO getBaseDAO(); } [/code:1] 远程接口配置 [code:1] <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <!-- - Dispatcher servlet for HTTP remoting via Hessian, Burlap, and Spring's - HTTP invoker (see remoting-servlet.xml for the controllers). --> <beans> <bean name="/FacadeRemoteService" class="org.springframework.remoting.caucho.HessianServiceExporter"> <property name="service"><ref bean="facadeRemoteService"/></property> <property name="serviceInterface"><value>remote.passCenter.service.IFacadeRemoteService</value></property> </bean> </beans> [/code:1] 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2005-03-21
dhj1 写道 一.目的: 在多个运行的系统中,只登录一次,就能运用各种系统,而不需再次登录,也就是开发一个网页通行证.
不知你具体是怎么实现单点登陆的,能否讲详细点 dhj1 写道 四.实现方法: 把所有的认证SESSION认证信息集中在认证中心,其它程序需要认证时,通过分布式技术传输认证中心的SESSION信息. 认证中心是个独立的模块吗? 在其中一个应用登陆认证以后,当链接跳转到其他应用时,此时是怎么触发分布式技术传输认证的? |
|
| 返回顶楼 | |
|
时间:2005-03-21
chikaiwang 写道 认证中心是个独立的模块吗?
在其中一个应用登陆认证以后,当链接跳转到其他应用时,此时是怎么触发分布式技术传输认证的? 认证中心是一个独立的程序, WEB SERVICE! 就象一个独立的网站,启动起来就能做认证了. 认证中心已经全部开发完成了,现在在做子认证模块.需要认证的子程序加挂此模块就可以用了.子模块认证部份已经完成了,现在增加权限划分功能,从认证中心传输过来权限划分的树型结构. 原理已经说过了,所有的session存放在认证中心,程序需要认证时,通过分布式技术取得认证中心的session |
|
| 返回顶楼 | |
|
时间:2005-03-21
本地系统是否保留认证中心的session ? 如果保留要做到与中心的session同步。
|
|
| 返回顶楼 | |
|
时间:2005-03-21
znjq 写道 本地系统是否保留认证中心的session ? 如果保留要做到与中心的session同步。
我现在没有保留,因为所有应用程序的服务器都在同一个局域网内,传输很快的. 但如果应用服务器分布于广域网,为了性能,本地可能需要保留SESSION.后者的情况我还没有用到. |
|
| 返回顶楼 | |
|
时间:2005-03-22
引用 实现跨域,也就是不能用COOKIE来实现 那SUN的SSO是怎么实现的? 虽然cookie本身不跨域,但同样可以利用它实现跨域的SSO |
|
| 返回顶楼 | |
|
时间:2005-03-22
不知道楼主以及楼上怎么实现跨域的。
我查过一些资料,目前只知道一种方式可以实现跨域sso,就是ibm Tivoli的实现方式。 不知楼主这个是目前的想法,还是已经做好的,你是如何标识一个请求的用户身份的(即如何识别多个请求是否为一台机器发送的)? |
|
| 返回顶楼 | |
|
时间:2005-03-22
IBM的tivoli也好,SUN的identity server也好,全是基于cookie的
这样做效率最高 关键就只有一点:集中认证! |
|
| 返回顶楼 | |
|
时间:2005-03-22
回楼上,据我所知,cookie是标识客户端请求的唯一方法,因此,对于楼主不使用cookie实现跨域访问sso,实在非常想了解下。
|
|
| 返回顶楼 | |
|
时间:2005-03-22
重写url,把当前用户的session id传递到集中认证服务器,然后由认证服务器把session copy到当前访问的应用服务器
不知道是不是楼主的实现 如果不重写url,就是基于cookie的session了 这样做安全性极低 |
|
| 返回顶楼 | |











