论坛首页 Java版 Webwork

[原创]网络认证中心开发心得!

浏览 10752 次
该帖已经被评为精华帖
作者 正文
最后更新时间: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]
   
最后更新时间:2005-03-21
dhj1 写道
一.目的: 在多个运行的系统中,只登录一次,就能运用各种系统,而不需再次登录,也就是开发一个网页通行证.

不知你具体是怎么实现单点登陆的,能否讲详细点。假如这多个运行的系统部署在不同的应用服务器上,而且域名可能不同。
dhj1 写道

四.实现方法: 把所有的认证SESSION认证信息集中在认证中心,其它程序需要认证时,通过分布式技术传输认证中心的SESSION信息.

认证中心是个独立的模块吗?
在其中一个应用登陆认证以后,当链接跳转到其他应用时,此时是怎么触发分布式技术传输认证的?
   
0 请登录后投票
最后更新时间:2005-03-21
chikaiwang 写道
认证中心是个独立的模块吗?
在其中一个应用登陆认证以后,当链接跳转到其他应用时,此时是怎么触发分布式技术传输认证的?



认证中心是一个独立的程序, WEB SERVICE! 就象一个独立的网站,启动起来就能做认证了.

认证中心已经全部开发完成了,现在在做子认证模块.需要认证的子程序加挂此模块就可以用了.子模块认证部份已经完成了,现在增加权限划分功能,从认证中心传输过来权限划分的树型结构.

原理已经说过了,所有的session存放在认证中心,程序需要认证时,通过分布式技术取得认证中心的session
   
0 请登录后投票
最后更新时间:2005-03-21
本地系统是否保留认证中心的session ? 如果保留要做到与中心的session同步。
   
0 请登录后投票
最后更新时间:2005-03-21
znjq 写道
本地系统是否保留认证中心的session ? 如果保留要做到与中心的session同步。


我现在没有保留,因为所有应用程序的服务器都在同一个局域网内,传输很快的. 但如果应用服务器分布于广域网,为了性能,本地可能需要保留SESSION.后者的情况我还没有用到.
   
0 请登录后投票
最后更新时间:2005-03-22
引用

实现跨域,也就是不能用COOKIE来实现


那SUN的SSO是怎么实现的?

虽然cookie本身不跨域,但同样可以利用它实现跨域的SSO
   
0 请登录后投票
最后更新时间:2005-03-22
不知道楼主以及楼上怎么实现跨域的。
我查过一些资料,目前只知道一种方式可以实现跨域sso,就是ibm Tivoli的实现方式。
不知楼主这个是目前的想法,还是已经做好的,你是如何标识一个请求的用户身份的(即如何识别多个请求是否为一台机器发送的)?
   
0 请登录后投票
最后更新时间:2005-03-22
IBM的tivoli也好,SUN的identity server也好,全是基于cookie的

这样做效率最高

关键就只有一点:集中认证!
   
0 请登录后投票
最后更新时间:2005-03-22
回楼上,据我所知,cookie是标识客户端请求的唯一方法,因此,对于楼主不使用cookie实现跨域访问sso,实在非常想了解下。
   
0 请登录后投票
最后更新时间:2005-03-22
重写url,把当前用户的session id传递到集中认证服务器,然后由认证服务器把session copy到当前访问的应用服务器

不知道是不是楼主的实现

如果不重写url,就是基于cookie的session了

这样做安全性极低
   
0 请登录后投票
论坛首页 Java版 Webwork

跳转论坛:
JavaEye推荐