【问题标题】:multiple Form submission with authentication带身份验证的多个表单提交
【发布时间】:2012-01-20 14:56:40
【问题描述】:

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

ScriptB 在提交时重定向我不想要的,我什至不在乎 scriptB 做了什么,我只需要将凭据发布给它。我关心 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 的情况下发布到它,那么 scriptA 会按预期工作,但在这里我试图将这 2 个合并在一起。

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>

查询代码:

        <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>

脚本A:

<?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;
}
?> 

有人知道我如何在提交后在登录屏幕上进行重定向吗?

【问题讨论】:

  • 你不能那样做。一旦您通过传统形式执行标准 POST,您的 Jquery 响应将不会返回。您需要先进行 JQuery 检查,然后在其成功响应中触发实际表单。你不能像那样同时开火。

标签: php javascript jquery forms ldap


【解决方案1】:

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

【讨论】:

  • 我不是 100% 确定 scriptB 正常运行的要求是什么,但我已经尝试了很多次,当我尝试通过 AJAX 发布到它时,我从 scriptB 收到一个空错误。
  • 那么你可能不走运了。不确定在将其作为标准表单提交时是否可以阻止 scriptB 重定向。
【解决方案2】:

我认为您需要停止提交表单的提交按钮,为此添加“return false;”在提交回调函数的末尾像这样:

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

    return false;
  });

});

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

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

【讨论】:

  • scriptA 的 php 代码进行处理,例如成功提交到 www.examplesite2.com 或提交不成功时重定向到登录屏幕
  • 我按照你说的做了,现在提交时我被 scriptB 的重定向重定向了。为什么 scriptA 的重定向不起作用?
猜你喜欢
  • 2017-11-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多