我正在使用angularjs和laravel5开发我的网站。我在angularjs和laravel5中编写了登录和注册页面的代码,其中验证了我的值并插入一切正常但在laravel 5中没有重定向url。
我在登录控制器中编写了return redirect('Home/profile')
之类的代码。它将总页面返回到angularjs控制器而不是重定向页面。
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中,显示“主页/个人资料”页面
答案 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');
});
以便您可以提供应在控制器中调用的方法。