如何通过laravel 5从angularjs登录提交重定向url

时间:2015-07-16 02:20:58

标签: angularjs laravel-5

我正在使用angularjs和laravel5开发我的网站。我在angularjs和laravel5中编写了登录和注册页面的代码,其中验证了我的值并插入一切正常但在laravel 5中没有重定向url。 我在登录控制器中编写了return redirect('Home/profile')之类的代码。它将总页面返回到angularjs控制器而不是重定向页面。

laravel中的

routes.php

Route::group(array('prefix'=>'api'),function(){
    Route::resource('register','Registration\RegisterController@basicForm');
    Route::resource('login','Registration\RegisterController@makeLogin');
});

我的控制员:

public function makeLogin()
{
    $email=Input::get('email');
    $pwd=Input::get('pwd');
    $verify=Authenticated::attempt($email,$pwd);
    if($verify)
    {
        return redirect('Home/profile');
    }
    else if($verify=='user')
    {
        return redirect('/')->with('Email address mismatch');
    }
    else if($verify=='pwd')
    {
        return redirect('/')->with('Password Authentication Failed');
    }
}

我通过工厂方法从角度js控制器发送邮件请求:

this.scope.authUserInfo.authenticateUser(this.scope.signin).then(function(data){
    console.log(data.data);
});

在此console.log中,显示“主页/个人资料”页面

1 个答案:

答案 0 :(得分:0)

我可以在Laravel代码中看到很多错误。

代码中的Authenticated是什么? Laravel中的身份验证服务称为Auth。您使用attempt()方法的方式不正确;这是方法签名:

attempt(array $credentials = array(), bool $remember = false, bool $login = true)

因此您应该将第一个参数中的电子邮件和密码作为数组传递,例如:

$verify = Auth::attempt(['email' => $email, 'password' => 

此外,attempt()方法在成功时返回布尔值:true,在失败时返回false。你的代码

if ($verify) {
    // ...
} else if ($verify == 'user') {
    // ...
} else if ($verify == 'pwd') {
    // ...
}

毫无意义,您永远不会运行else部分,因为失败false始终与'user''pwd'不同。因此,当身份验证失败时,您将到达makeLogin()方法的末尾,Laravel将返回一个空白页。

你应该使用类似的东西:

if ($verify) {
    // authenticated: go to the profile page
} else {
    // username OR password are wrong
}

(在我看来,出于安全原因,你不应该暗示这两者是错的:潜在的攻击者会知道他/她是否猜到了正确的电子邮件,并集中精力猜测密码。)

如果您真的想要向用户提供有关其数据错误的提示,您应该使用不同的技术,例如使用正确的电子邮件在users表中搜索记录,以了解用户是否是否存在(提供的密码错误)(提供的电子邮件错误)。

在客户端,我认为Angular不会自行重定向。请参阅Handle an express redirect from Angular POST的答案,即使在该问题中服务器使用的是ExpressJs而不是Laravel,但基本知识是相同的。

您应该明白,在大多数情况下,Angular客户端希望只接收数据,而不是完整的HTML页面。这是我尝试做你想做的小事:

在Laravel方面:

public function makeLogin(Request $request)
{
    $email = $request->get('email');
    $pwd = $request->get('pwd');

    if (Auth::attempt(['email' => $email, 'password' => $pwd])) {
        // authenticated!

        // if you return an array from a controller public method, Laravel
        // will convert it to JSON; I also use the url() Laravel helper to
        // generate a fully qualified url to the path
        return [
            'status' => 'redirect',
            'to' => url('home/profile')
        ];
    }

    // failed
    return [
        'status' => 'failed',
        'message' => 'Email or password are wrong'
    ];
}

现在该方法将返回JSON答案。在Angular方面,你可以做类似的事情(我不是Angular guru,这里可能会有错误):

this.scope.authUserInfo.authenticateUser(this.scope.signin).then(function(data) {
    if (data.response == 'redirect') {
        $location.url(data.to);
    } else {
        // failed: you can show the error message
        console.log(data.message);
    }
});

<强>更新

我注意到路线也有问题。您的控制器似乎是一个资源丰富的控制器,因此请勿使用Route::resource()方法。请改用get()post()方法:

Route::group(array('prefix'=>'api'),function(){
    Route::get('register', 'Registration\RegisterController@basicForm');
    Route::post('login', 'Registration\RegisterController@makeLogin');
});

以便您可以提供应在控制器中调用的方法。