即使使用 AngularJS 和 PHP 的凭据不正确,登录仍然会指示
Posted
技术标签:
【中文标题】即使使用 AngularJS 和 PHP 的凭据不正确,登录仍然会指示【英文标题】:Login still directs even if incorrect credential with AngularJS and PHP 【发布时间】:2016-03-25 01:53:27 【问题描述】:php 代码需要从表中获取数据,将其解码为 JSON,然后将其发送到 AngularJS。
如果登录凭据正确,Angular JS 会重定向。
但是,即使凭据不正确,用户仍然会被重定向(真正的语句总是通过)。
PHP 代码:
<?php
$data = json_decode(file_get_contents("php://input"));
$username = $data->username;
$password = $data->password;
/*
* Collect all Details from Angular HTTP Request.
*/ require_once("connection.php");
//must read from table
$connection = connectTomysql();
//complete from here
$query = "SELECT count(*) FROM tbl_admin WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($connection ,$query);
$row = mysqli_fetch_row($result);
$count = $row[0];
if($count == 1)
echo true;
else
echo false;
?>
AngularJS 控制器:
app.controller('loginCtrl', function ($scope, $http, $location)
/*
* This method will be called on click event of button.
* Here we will read the email and password value and call our PHP file.
*/
$scope.checkCredentials = function (credentials)
$http.post('model/getAdmin.php',credentials).success(function(data)
console.log("true");
$location.path("/memberList");
)
.error(function(err)
$log.error(err);
console.log("false");
);
);
html 表单代码
<form class="form-group" id="customForms" ng-controller="loginCtrl">
<label> Username </label>
<input id="customFormsInput" class="form-control" ng-model="credentials.username" type="text" placeholder="Username goes here" required/>
<br>
<label> Password </label>
<input id="customFormsInput" class="form-control" ng-model="credentials.password" type="password" placeholder="Password goes here" required/>
<br> <br>
<button class="btn btn-primary" type="submit" ng-click="checkCredentials(credentials)"> Submit </button>
<br>
responseMessage
<!-- Shows message depending on login type -->
</form>
【问题讨论】:
尝试console.log(data)
并查看服务器响应。
我已经从 php 端更改了 echo,现在 console.log(data)
向我展示了从 PHP 端验证是好的。 (返回 PHP True 和 PHP False)。然而,控制只是通过真实的陈述而已。
$http.post
解析即使服务器以false
响应。取而代之的是,服务器可以用 JSON 格式的一些信息进行响应,这样您的应用程序就知道为什么检查凭据失败了。
换句话说:你需要在你的成功函数中添加一个检查。喜欢:.success(function(data) if (data === "PHP True") $location.path ...
工作谢谢!!! @iWörk
【参考方案1】:
您必须将if-else
条件添加到您的success
回调,因为即使您从PHP 代码发送false
,您也总是发送200 响应:
$scope.checkCredentials = function (credentials)
$http.post('model/getAdmin.php',credentials).success(function(data)
console.log("true", data);
if (data == true) // Or in whatever form you are receiving true/false
$location.path("/memberList");
else
$log.error(err);
console.log("false");
)
如果您想让旧代码正常工作,即在 Angular 中使用 success
和 error
回调,那么您需要从您的 PHP 代码中发送非 200 响应代码以及 false
,例如:
if($count == 1)
echo true;
else
http_response_code(406); // not acceptable response code
echo false;
(推荐第二种方案)
我从未使用过 PHP,因此请确保 http_response_code(406);
写得正确。
【讨论】:
以上是关于即使使用 AngularJS 和 PHP 的凭据不正确,登录仍然会指示的主要内容,如果未能解决你的问题,请参考以下文章
Spring security/hibernate:即使是正确的凭据也不正确?
Spring Security - 即使凭据正确,身份验证也不起作用
AngularJS $http:当凭据标志为真时,不能在 Access-Control-Allow-Origin 中使用通配符
Strapi 在生产中给我数据库错误,即使我使用的是正确的凭据