1

我想修改身份验证行为,以便整个过程可以通过 xhr 在客户端完成。因此,例如,当我汇总登录表单时,login_handler 将返回一些关于成功和错误的 json 数据,而不是加载新的 html 页面或进行任何类型的重定向。我应该怎么做?

4

3 回答 3

2

我试图用 TG2 做同样的事情。这是 amol 的延伸答案。我正在使用它,它对我来说很好用。

@expose("json")
def login(self, login, password):

    identity = {"login": login,
                "password": password}

    # Authenticate the credentials
    username =  request.environ['repoze.who.plugins']['sqlauth'].authenticate(request.environ, identity)

    if username:
        print("Logged into " + username)
        # Remember this user
        response.headers = request.environ['repoze.who.plugins']['main_identifier'].remember(request.environ, {'repoze.who.userid':username})

        return {"status": True, "username": username}
    else:
        print("Could not authenticate")
        return {"status": False, "username": None}
于 2011-09-30T08:38:24.700 回答
2

您应该能够通过获取标识符并调用 remember 方法来编写自己的登录控制器。

首先从数据库中检索您的用户,验证密码,然后如果一切正确,您可以设置身份验证 cookie:

response.headers = request.environ['repoze.who.plugins']['main_identifier'].remember(request.environ, {'repoze.who.userid':user_name})

最后还从控制器返回一个 json dict,确认成功或不用于 UI 目的

于 2011-07-09T17:34:47.680 回答
1

如果您提取用户名和密码并将它们作为参数发送到登录脚本,则可以验证用户并相应地返回结果。

$.ajax({
    url: "login.php",
    data: "username="+$("#username")+"&password="+$("#password"),
    method: 'GET',
    dataType: 'json',
    async: false,
    success: function(msg){
        if(msg.success){
            $("#content_area").html(msg.data);
        }
    }
});

脚本看起来像这样:

if( $_REQUEST['username'] == "correct_username" && $_REQUEST['password'] == "correct_password"){
     return json_encode( array( "success" => true, "data" => "stuff" ) );
}else{
     return json_encode( array( "success" => false ) );
}

不过,我建议不要这样做,因为该过程本身充满了安全问题和漏洞。如果您可以安全地将凭据发布到服务器并允许 Web 服务器处理会话、设置 cookie 并正确进行身份验证,那么请尝试这样做。

于 2011-03-28T07:45:55.357 回答