单位需要使用很多B/S架构的应用系统,登录各系统只需要用户名和密码,因为系统太多,每个人要记住很多不同系统的用户和密码,现在想实现一个用户名和密码的集中管理系统,这个系统提供对其他系统的自动访问,即提供其他系统的链接,点击链接时自动提取用户名、密码提交。请问用什么技术能实现??

解决方案 »

  1.   

    是这样的,单位需要使用很多web系统,每个系统都有不同的用户和密码,而这些系统我只能通过浏览器访问,服务器无法接触到,我就想将这些系统的登录做成一个自动化的登录,将相应系统的登录地址,用户,密码保存到数据库中,然后在一个页面里提供统一的登录链接,这样只要点击不同应用系统的链接,就模拟手工登录的工作,自动提交用户和密码,实现登录。网上有一个阿拉神登软件,我就想实现它的网站自动登录功能,不知道原理是什么
      

  2.   

    LDAP 如果你公司已经用active directory 那更方便,用户用和他登陆profil同一个帐号如果不用,也有apache directory server
      

  3.   

    在各个系统的用户权限表中添加一个键字段,将各个系统的用户名密码信息连接起来,在每个系统往其他系统进入的时候,利用类似代理模式的方法,也就是事先利用跳转元系统的这个键字段和跳转先的键字段进行验证,而不是利用他在不同系统间的用户名和密码验证(如利用下面的 连接各系统权限table字段),只在登录其中一个系统的时候用用户名和密码登录,系统间跳转用这个字段,而不用用户名和密码系统一权限table(DB)                             系统二权限table(DB)
    用户名  密码  连接各系统权限table字段             用户名  密码  连接各系统权限table字段
    张三    123   A00001                         张三     567  A00001
    李四    abc   A00002                         李四     kol  A00002
      

  4.   

    系统一权限table(DB)                           系统二权限table(DB)
    用户名 密码 连接各系统权限table字段             用户名 密码 连接各系统权限table字段
    张三 123 A00001                             张三 567 A00001
    李四 abc A00002                             李四 kol A00002
      

  5.   

    你的要求是标准的单点登陆,英文是 single sign on 简称 SSO 网上的资料很多, 最常用的是CAS方式。
      

  6.   

    我的描述好像还不清楚,大家没明白
    我看了一下CAS SSO,很复杂,大体上感觉需要部署cas server和cas client,其中client需要部署在要实现单点登录的各个系统中,以实现统一验证,不知道我理解的正确否,如果正确,就不符合我的要求,我在简化一下我的需求:我要做一个web站点,输入用户名、密码后打开一个主界面(这个是我们自己能控制的),界面上给出了几个链接,百度、雅虎、搜狐、csdn等等,我在这几个系统中都有相应的用户和密码,我怎样实现点击这几个链接自动用我的相应用户和密码登陆(我当然不能修改百度、搜狐等的后台系统)??就像我手工在这几个系统的登录页面填写了用户、密码,然后单击提交按钮,我要实现的也就是这个模拟手工动作,其他安全、验证码什么的都不考虑
      

  7.   

    是啊,关键该怎么用java整出来啊,一点思路也没有
      

  8.   

    1、在不同系统中有可能不止密码不一样,用户名也不一样、那么必须有一个分配给用户的唯一的可以辨识其身份的一个ID、而且各个系统中这个ID对于同一个用户都得是一样的。也有可能这个ID就是每个员工的工号、也就是用户名。
    2、登录其中一个系统成功、利用输入的用户名、密码取得这个唯一的ID、web中可以放入session或request中。取不到则是登录失败、无此人。
    3、点击链接进入其他系统、在没有输入用户名和密码的情况下、取出session中的ID、有则顺利登录、为空则提示用户登录。同时利用该ID可以从你所在的系统的表中检出你在该系统中的用户名和密码。按lz说的我理解的比较最简单的做法,不知道是不是这个意思
      

  9.   

    对,基本就是这个意思,主管理系统中维护这样一个表,表中对应有这个主管理系统登录用户的ID,其他各系统的登录地址,相应系统的用户名,密码,我在主界面中各个链接的href就应该是表中的各系统的登录地址,这样登陆地址,用户,密码都有了,我该怎样实现自动登录呢?就是这一块不明白。
    我有一点想法,就是先分析登录页面,找到其中的登录form,一是看form中的action是什么,这个就应该是最终的提交地址,另外看用户名和用户密码的<input>标签中的name属性,就知道了将来传递的用户、密码键值对是什么,这些知道了,还需要分析些什么??session和cookie??用java怎样实现自动提交这些信息?并且能够在浏览器中呈现出登录后的页面???
    我在网上下载过一个阿拉神登软件,基本就是想用java来实现它的web网站自动登录功能,只不过我想将相关数据保存在数据库中。
    希望得到您的指点。谢谢大家的回帖
      

  10.   

    http://mail.gs.yantai.gov.cn/,这个邮箱,假设我知道用户名:user123,密码:pwd456,怎样编写程序实现自动登录???
      

  11.   

    <TD class=font align=right width="25%">用户名:</TD>
    <TD><INPUT class=input size=24 name=LoginName id=uid></TD>上面是从页面源文件复制过来的
    首先吐槽一下为啥js代码直接写在主页里边没单独拆出来
    然后,知道用户名的输入框名字是name,应该有方法把字符串传给他吧?
      

  12.   

    function _login() {
        var messageDefault = "系统错误,请稍候再试。";    formData = $("input, select").serialize();    $.ajax({
            type: "POST",
            url: "/cgi-bin/user_login",
            data: formData + "&rnd=" + parseInt(Math.random()*9999),
            dataType: "html",
            success: function (dataRes) {        switch ($.trim(dataRes)) {
            case "0":
            window.location = "/cgi-bin/user_login";
            break;
            case "2":
            showMessage("您输入的用户名或密码错误");
            break;
            case "3":
            showMessage("本系统已禁止使用别名登录,请使用真实用户名登录。");
            break;
            case "4":
            showMessage("由于该用户尝试的登录次数达到最大值,已被禁止登录。");
            break;
            case "5":
                showMessage("您输入的密码错误");
            break;
            case "6":
                showMessage("该用户已经被锁定");
            break;
            case "7":
                showMessage("该用户所在的域已经过期");
            break;
            case "8":
                showMessage("该用户已经过期");
            break;
            case "9":
                showMessage("您输入的域名错误");
            break;
            case "10":
                showMessage("用户提交的验证码错误");
            break;
            case "11":
                showMessage("license过期,请与管理员联系");
            break;
            case "12":
                showMessage("用户输入的密码过短");
            break;
            case "13":
                showMessage("导用户信件出错");
            break;
            case "14":
                showMessage("异常错误");
            break;
            case "15":
                showMessage("非法用户名");
            break;
            case "16":
                showMessage("非法域名");
            case "1":
                showMessage(messageDefault);
            break;
            }
    },
    error: function () {
               showMessage(messageDefault);
           }
    });
    }
      

  13.   


    这需要目标系统提供auth的api啊,需要根据每个系统的api去请求登陆一个成熟的系统不可能让你一个简单的post请求夹带用户信息就能实现登陆了
      

  14.   

    username||password||linkAddress||||||targetSystemUserName||targetSystemPassword
    pk||||||| pk |||||||pk
    张三||||||123||||||||www.sina.com||||张三新浪用户名|||||||||||张三新浪密码
    张三||||||234||||||||www.sohu.com||||张三搜狐用户名|||||||||||张三搜狐密码
      

  15.   

    上面那个错了,这个
    按楼主说的你建立的表结构应该是这样的
    username||password||linkAddress||||||targetSystemUserName||targetSystemPassword
    pk||||||| pk |||||||pk
    张三||||||123||||||||www.sina.com||||张三新浪用户名|||||||||||张三新浪密码
    张三||||||123||||||||www.sohu.com||||张三搜狐用户名|||||||||||张三搜狐密码 
    李四||||||aaa||||||||www.sina.com||||李四新浪用户名|||||||||||李四新浪密码
    李四||||||aaa||||||||www.sohu.com||||李四搜狐用户名|||||||||||李四搜狐密码 利用用户名"张三" 密码"123"登录主系统后,再点击新浪的链接,在到达新浪之前,先利用已经认证过的"张三""123"在该系统的链接表中检索新浪用户名和密码,然后利用检索出来的用户名密码再去新浪系统链接表中验证是否存在该用户实现登录
      

  16.   

    后台的管理基本就是这么个表,张三利用用户名张三,密码123登录主系统,通过查询可以列出张三需要使用的各个系统,这里楼上列举了两条www.sina.com,www.sohu.com,不同用户可以根据自己的需要添加不同的系统,这个好实现,下一步就是通过这些信息来实现自动登录了(就是到这里没思路)。
      

  17.   

    我来接着分析,要实现自动登录,其实就是模拟浏览器实现get或post提交,所以单凭上面的表中的登录地址,就象www.sohu.com,用户名(就像张三搜狐用户名)、密码(张三搜狐密码)还是不够的,还需要一个更准确的登录认证处理资源地址,代表用户名的标签名(或叫变量名)和代表密码的标签名(或叫变量名),这些也能容易得到,分析一下这个吧:http://mail.gs.yantai.gov.cn
    打开登录页面,查看源代码,通过<form>标签,可以得到用户名和密码对应的变量名(这个说法可能不规范,应该是<input type=text name=>这个标签的name值)这里分别是LoginName,Password(源代码:
    <TD class=font align=right width="25%">用户名:</TD>
    <TD><INPUT class=input size=24 name=LoginName id=uid></TD>和
    <TD align=right class=font>密 码:</TD>
    <TD><INPUT class=input type=password size=24 name=Password></TD>)
    登录地址应该是"/cgi-bin/user_login",用java技术来说,这应该是一个HttpServlet或者structs架构中的Action。这个是通过源代码中_login()函数中的$.ajax()函数得到的(可以看24楼),在这个函数中可以看到有一个formData,这就是POST方法要传递的参数,formData一开始这样赋值的: formData = $("input, select").serialize();这是使用了jquery的标签过滤器,选择页面上的input和select标签,然后调用其serialize()方法(jquery不太熟悉,有些猜测成分),serialize()方法不知道什么功能,猜测就是取出键值对,formData = $("input, select").serialize();这一行执行后,formData大体应该是这样:LoginName=张三&domain=gs.yantai.gov.cn&Password=123&skin=,在提交前又加上了一个参数随机码就是"&rnd=" + parseInt(Math.random()*9999)。
    再来分析登陆地址,这一块有疑惑,我们要做自动提交,这个地址是不是应该写绝对地址,象这样:http://mail.gs.yantai.gov.cn/cgi-bin/user_login,或者要设置一个host为http://mail.gs.yantai.gov.cn/,因为直接这样写"/cgi-bin/user_login",应该是有上下文的,是针对当前浏览器打开的应用的。(请解惑)。
    再往后不会了。
      

  18.   

    就用一个公用表,将来实现的是用户动态添加,用户想使用什么系统,比如现在有A,B,C,D,E五个系统,张三只使用A,B,他通过一个添加应用系统的管理页面,添加上A和B,李四使用C,D,E,他也动态添加。
      

  19.   

    感谢懒蜘蛛启发我想到另一个思路,就是自动填充然后自动点击按钮,现在就是在页面上显示个应用系统的链接,点击链接后,直接打开系统登录界面,就像这样:<a href=#>自动进入A系统</a>,现在的关键是要获得对这个新打开窗口(页面)的控制权,然后修改用户和密码(这个当然可以从数据库提取),然后在控制执行相应的提交按钮就行了。
    现在的重点转入怎样从一个页面控制另一个页面内容了
      

  20.   


    (两种可能)
    一种是固定各系统的用户名,可用员工工号或者各自邮箱 
    所建表主要关注于他对一个系统是否有访问权
    如:|||工号|||密码|||系统ID|||系统名|||系统访问可否
    |||||||A001|||1232|||SINA00|||新浪网|||可
    |||||||A001|||2312|||SOHU00|||搜狐网|||可
    |||||||A002|||A123|||SINA00|||新浪网|||不可
    |||||||A002|||ASDF|||SOHU00|||搜狐网|||可这种情况,各个系统的密码只是用于第一次登陆,当登陆成功
    if(loginSuccess)
    {
        session.setAttibute("userId","A001");
    }跳转到其他系统时候验证(利用session中保存的工号和点击该系统获得的系统ID)
    String systemId=request.getParameter("SystemId")if(session.getAttribute("userId")!=null)
    {
        String userId = (String)session.getAttribute("userId");
        
        //利用userId 和systemId去表中验证访问可否
        if(可)
        {
            response.redirect("sinaIndex.jsp");
        }else
        {
            response.redirect("error.jsp");
        }
    }else
    {
        response.redirect("sinaLogin.jsp");
    }
      

  21.   


    另一种一个用户在不同系统的用户名和密码都不一样
    但是要有一个字段唯一标示这个用户
    如:|||用户名|||密码|||系统ID|||系统名|||用户标示
    |||||||123112|||1232|||SINA00|||新浪网|||0001
    |||||||213123|||2312|||SOHU00|||搜狐网|||0001
    |||||||213132|||2312|||SOHU00|||百度网|||0001
    |||||||AEE112|||A123|||SINA00|||新浪网|||0002
    |||||||AE2112|||ASDF|||SOHU00|||搜狐网|||0002这种情况看最后一个字段就知道是哪个用户了,只有他对这个系统有
    访问权限才把他加入这个表,如0001用户对百度有访问权限,但是
    0002用户没有,所以他就比0001少一行信息if(loginSuccess)
    {
        //登录成功后利用用户名和密码取得标示列然后存入session
        session.setAttribute("userId","0001")
    }访问其他系统的是否童谣利用获得的系统ID
    和session保存的标示ID验证
    DB检索有数据则登录成功
    没数据则要求跳转到无权限提示页面
    如果session为空,说明还没有登录,就跳转到请他登录画面
    和上面思路就差不多了
      

  22.   

    其实看了这个我明白了,你的项目不可能实现,现在所有网站为了防止DOS攻击,都有防止自动登录的功能,一般都会弄个验证码什么的。由于你不可能自动输入验证码(除非验证码做得太烂),所以你不能自动登录。
      

  23.   

    做内部系统用,全部没有验证码,所以只考虑简单的用户、密码form验证就行