多个表单提交与身份验证

时间:2011-12-14 20:26:35

标签: php javascript jquery forms ldap

我有提交表单的scriptA和siteB。脚本B是一个单独的脚本,不是我的,所以我不能改变它的任何设置..但是,ScriptA是我的,所以我可以在下面发布该脚本。给定登录屏幕,用户输入其登录凭据然后单击登录。在此之后,表单POSTS到scriptB,它在表单的action属性中,然后表单使用JQUERY POSTS到scriptA。 scriptB我不在乎,我只需要将表单发布到它就可以了。 POSTA的ScriptA将凭据POSTED传递给它并执行LDAP绑定以查看凭据是否与数据库中的凭据匹配,如果匹配,则用户被重定向到www.examplesite.com,如果给定的凭据为假,则用户被发送回登录屏幕,说明用户名和密码无效。

ScriptB重定向提交,我不想要,我甚至不关心scriptB做什么,我只需要将凭证POST给它。我关心scriptA,一旦scriptA获得了应该重定向用户的正确凭据。我无法对scriptB进行更改,因此我必须以某种方式忽略其重定向。

目前发生了什么: 1)在登录屏幕上,用户在输入凭证后点击提交 2)ScriptB通过动作属性发布,ScriptA通过JQUERY发布 3)ScriptB将用户重定向到www.examplesite.com

应该会发生什么: 1)在登录屏幕上,用户在输入凭证后点击提交 2)ScriptB通过动作属性发布,ScriptA通过JQUERY发布 3)如果scriptA发现凭据错误,它应该重定向回登录屏幕,消息无效登录。 4)一旦用户在登录屏幕用户输入正确的凭证并且scriptA批准这些凭证,将用户重定向到www.example2site.com

下面是我的scriptA,如果我在没有scriptB的情况下POST它,那么scriptA就像预期的那样工作,但在这里我试图将这两个合并在一起。

scriptA基本上是一个网站登录身份验证,它通过LDAP绑定进行身份验证。

提交两个脚本的工作登录屏幕代码:

    <form action="http://servicedesk.site.com/j_security_check" method=post id="form" name="Auth" class="appnitro">
        <div class="form_description">
            <h2>Login</h2>

        </div>


            <ul >

                    <li id="li_1" >
        <label class="description" for="element_1">Username </label>
        <div>
            <input id="element_1" name="j_username" class="element text medium" type="text" maxlength="255" value=""/>
        </div>
        </li>       <li id="li_2" >
        <label class="description" for="element_2">Password </label>
        <div>
            <input id="element_2" name="j_password" class="element text medium" type="password" maxlength="255" value=""/>
        </div>
        </li>

                    <li class="buttons">


                <input id="saveForm" class="button_text" type="submit" name="submit" value="Log In" />
        </li>
            </ul>

    </form>

JQUERY CODE:

        <script language="JavaScript" type="text/JavaScript">
$(document).ready( function(){

  $('#form').submit(function(){

    $.ajax({
      type: 'POST',
      async: true,
      url: "https://noc.sde.site.com/okhawaja/Login/formLanding/authenticate.php",
      data: $(this).serialize(),
      success: function(data, status, xhr){

      },
      error: function(xhr, status, err) {
        alert(status + ": " + err);
      }
    });

  });



});


        </script>

SCRIPTA:

<?php
session_start();

if( isset($_POST['j_username']) && isset($_POST['j_password']) )
{
    //LDAP stuff here.
    $username = trim($_POST['j_username']);
    $password = trim($_POST['j_password']);

    echo("Authenticating...");
    $ds = ldap_connect('ldap://ldap:port');

        ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);

    //Can't connect to LDAP.
    if( !ds )
    {

$_SESSION['rdr']="Invalid Login. Try Again.";


        header( "Location: https://noc.sde.site.com/okhawaja/Login/formLanding/login.php" );


        exit;
    }

    //Connection made -- bind anonymously and get dn for username.
    $bind = @ldap_bind($ds);

    //Check to make sure we're bound.
    if( !bind )
    {
$_SESSION['rdr']="Invalid Login. Try Again.";



       header( "Location: https://noc.sde.site.com/okhawaja/Login/formLanding/login.php" );

        exit;
    }

    $search = ldap_search($ds, "ou=People,DC=sde,DC=site,DC=com", "uid=$username");

    //Make sure only ONE result was returned -- if not, they might've thrown a * into the username.  Bad user!
    if( ldap_count_entries($ds,$search) != 1 )
    {


$_SESSION['rdr']="Invalid Login. Try Again.";



        header( "Location: https://noc.sde.site.com/okhawaja/Login/formLanding/login.php" );

        redirect(_WEBROOT_ . "/try1b.php");

        exit;
    }

    $info = ldap_get_entries($ds, $search);

    //Now, try to rebind with their full dn and password.
    $bind = @ldap_bind($ds, $info[0][dn], $password);
    if( !$bind || !isset($bind))
    {


$_SESSION['rdr']="Invalid Login. Try Again.";



header( "Location: https://noc.sde.site.com/okhawaja/Login/formLanding/login.php" );

        redirect(_WEBROOT_ . "/try1b.php");

        exit;
    }

    //Now verify the previous search using their credentials.
    $search = ldap_search($ds, "ou=People,DC=sde,DC=rogersdigitalmedia,DC=com", "uid=$username");

    $info = ldap_get_entries($ds, $search);
    if( $username == $info[0][uid][0] )
    {
        $_SESSION['username'] = $username;
        $_SESSION['fullname'] = $info[0][cn][0]; 
        $_SESSION['email'] = $info[0][mail][0];
        $_SESSION['phone'] = $info[0][telephonenumber][0];
header( "Location: https://noc.sde.site.com/okhawaja/service_desk_portal/index.php" );

        exit;
    }
    else
    {


$_SESSION['rdr']="Invalid Login. Try Again.";


 header( "Location: https://noc.sde.site.com/okhawaja/Login/formLanding/login.php" );

        redirect(_WEBROOT_ . "/try1b.php");

        exit;
    }
    ldap_close($ds);
    exit;
}
?> 

任何人都知道如何在提交时在登录屏幕上进行重定向?

2 个答案:

答案 0 :(得分:0)

为什么不通过ajax发布到脚本B,并使用event.preventDefault()来阻止按钮执行标准表单帖子?

答案 1 :(得分:0)

我认为您需要停止提交表单的提交按钮,为此添加“return false;”在提交回调函数结束时如下:

error: function(xhr, status, err) {
        alert(status + ": " + err);
      }
    });

    return false;
  });

});

然后,在成功回调中执行您需要的任何操作,无论是将其提交到其他URL还是其他内容。这可能有效:

success: function(data, status, xhr){
    $('#form').unbind('submit');
    $('#form').submit();
},