westdc用户库与geonetwork的同步

在数据中心系统里,westdc和geonetwork里各维护了一套用户库,有各自的登录系统,之前在处理元数据的时候二者一直是独立的,之前有一篇帖子是将geonetwork的用户密码更改为md5后进行同步,但这终归不是长久之计,因此需要一个好的方法能把二者给深度集成。

深度集成的关键在于两个方面:
1. 用户信息能否自动同步,即在westdc中修改后能否自动反馈到geonetwork中。
2. 用户登录信息能否自动进行,即只需要用户登录一次即可。

存在问题:
1. 二者的用户密码加密方式不同,一个是MD5,一个是SHA1。
2. 二者的WEB实现代码不同,一个是PHP5,一个是JAVA,二者的SESSION不能直接共享。

而为解决这些问题,网上也有很多的说明,SESSION共享可以通过数据库保存SESSION的方法进行处理,但这种方法对两个系统都有相当大的修改,工作量较大。因此后来用了一个折衷的方法来进行处理,即:
1. 在westdc中用户密码不变,而在geonetwork中的密码为sha1(md5(md5(pwd)))方式。
2. 在westdc中登录后可以自动登录geonetwork系统,对用户而言,是只登录了一次。同时由于采用了两次MD5加密,也保证了安全性。
但在处理数据库自动同步的时候,还是出现了很多问题,主要是通过view进行了规则的中转后,导致SQL执行失败,最终通过在users表中添加trigger,而由trigger直接调用dblink执行操作geonetwork/user表。
BTW:在postgresql中使用sha1需要安装pgcrypto扩展。


已发布

分类

,

来自

评论

《 “westdc用户库与geonetwork的同步” 》 有 2 条评论

  1. TuLeung 的头像
    TuLeung

    hi,man
    trigger怎么直接调用dblink,可以发份实现代码不,谢了

  2. wlx 的头像
    wlx

    参考dblink的网站,或者直接看postgresql里的对应文档。
    我们的这里代码如下,供参考。

    BEGIN
    pwd := encode(digest(md5(NEW.password),’sha1′),’hex’);
    perform dblink_connect(‘hostaddr=127.0.0.1 dbname=geonetwork’);
    IF( TG_OP=’INSERT’ ) THEN
    tid := currval(pg_get_serial_sequence(‘users’, ‘id’));
    perform dblink_exec(‘insert into users(id,username,password,email,profile)
    values(‘||tid||’,”’||NEW.username||”’,”’||pwd||”’,”’||NEW.email||”’,”Editor”);’);
    ELSIF ( TG_OP=’UPDATE’ ) THEN
    IF NEW.password<>OLD.password THEN
    perform dblink_exec(‘update users set password=”’||pwd||”’ where id=’||NEW.id||’;’);
    END IF;
    END IF;
    perform dblink_disconnect();
    RETURN NULL;
    END;

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注