2015-05-24 139 views
1

我正在使用AngularJS(前端),Slim Framework(后端),PHP和MySQL。我试图验证用户电子邮件和密码与数据库存储的值,但我可以用不正确的电子邮件和密码登录。我看不出我的问题在哪里。请帮帮我!这里是我的代码如何使用Slim验证登录PHP

的login.html

<form novalidate name="SigninForm" id="add-new-form" method="post" action=""> <div class="form-group"> 
    <label for="first_name">Email:</label> 
    <input class="form-control" type="text" ng-model="user.email" required /> 
</div> 

<div class="form-group"> 
    <label for="address">Password:</label> 
    <input class="form-control" type="text" ng-model="user.password" /> 
</div> 
    <button class="btn btn-primary" ng-disabled="SigninForm .$invalid || isUnchanged(user)" id="login" ng-click="signin(user)">Login!</button></form> 

app.js

angular.module('CrudApp', []). 
    config(['$routeProvider', function($routeProvider) 
{ 
    $routeProvider. 
when('/', {templateUrl: 'assets/tpl/home.html', controller: HomeCtrl}). 
when('/login-user', {templateUrl: 'assets/tpl/login.html', controller: LoginCtrl}). 
otherwise({redirectTo: '/'}); 
}]); 
function HomeCtrl($scope, $http) 
{ 
    $http.get('api/users').success(function(data) 
    { 
    $scope.users = data; 
    }); 
} 
function LoginCtrl($scope, $http, $location) { 
    $scope.master = {}; 
    $scope.activePath = null; 
    $scope.signin = function(user, AddNewForm) { 
    $http.post('api/login_user', user).success(function(){ 
     $scope.reset(); 
     $scope.activePath = $location.path('/list-user'); 
     //alert('No access available.'); 
    }); 
    $scope.reset = function() { 
     $scope.user = angular.copy($scope.master); 
    }; 
    $scope.reset(); 
    }; 
} 

的index.php

<?php 

require 'Slim/Slim.php'; 

$app = new Slim(); 

$app->post('/login_user', 'login'); 

$app->run(); 


function login()              
{ 
    $request = Slim::getInstance()->request(); 
    $user = json_decode($request->getBody()); 
    $email= $user->email; 
    $password= $user->password; 

if(!empty($email)&&!empty($password)) 
    { 
     $sql="SELECT name, email FROM user WHERE email='$email' and password='$password'"; 
     $db = getConnection(); 
    try { 
     $result=$db->query($sql); 

       if (!$result) { // add this check. 
         die('Invalid query: ' . mysql_error()); 
       } 
     $row["user"]= $result->fetchAll(PDO::FETCH_OBJ); 
     $db=null; 
     echo json_encode($row); 

    } catch(PDOException $e) 
    { 
     error_log($e->getMessage(), 3, '/var/tmp/php.log'); 
     echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
    } 
} 

function getConnection() { 
    $dbhost="127.0.0.1"; 
    $dbuser="root"; 
    $dbpass=""; 
    $dbname="TQA"; 
    $dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    return $dbh; 
} 

?> 
+0

嘿!下面的答案对你有帮助吗?如果是这样,请接受它。它可以帮助其他人寻求类似问题的解决方案。 –

回答

0

的问题是,你不管返回一个成功的结果用户输入。 Apache,nginx和PHP内置的web服务器会返回一个默认的HTTP代码200,用于处理没有问题的请求。由于你的路由没有明确的失败,所以你的服务器似乎对请求/响应一切正常。

例如,如果用户使用电子邮件或密码为空提交表单,您应该返回代码为400的响应(错误的请求)。此外,如果没有在数据库中找到与给定电子邮件和密码匹配的用户,您可能会返回代码401(未授权)。

有关HTTP状态代码的更多信息,请参阅http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

当使用正确的状态代码,该login功能可能是这个样子:

function login() 
{ 
    $app = Slim::getInstance(); 
    $request = $app->request(); 
    $user = json_decode($request->getBody()); 
    $email = $user->email; 
    $password = $user->password; 
    if (empty($email) || empty($password)) { 
     $error = 'Email and password are required'; 

     // Bad request 
     return jsonResponse($error, 400); 
    } 
    $sql = "SELECT name, email FROM user " 
     . "WHERE email = '$email' AND password = '$password'"; 
    $db = getConnection(); 
    $row = array(); 
    try { 
     $result = $db->query($sql); 
     if (!$result) { 
      $error = 'Invalid query: ' . mysql_error(); 

      // Internal server error 
      return jsonResponse($error, 500); 
     } 
     $user = $result->fetchAll(PDO::FETCH_OBJ); 
     if (empty($user)) { 

      // Unauthorized 
      return jsonResponse($error, 401); 
     } 
     $row["user"] = $user; 
     $db = null; 
    } catch(PDOException $e) { 
     error_log($e->getMessage(), 3, '/var/tmp/php.log'); 
     $error = array('error' => array ('text' => $e->getMessage())); 

     // Internal server error 
     return jsonResponse($error, 500); 
    } 

    // OK, default is 200 
    return jsonResponse($row); 
} 

在上面的代码中,我使用下面的函数,以避免重复的代码。它不是Slim或PHP的一部分,因此如果您想使用它,请将其添加到您的项目中。

function jsonResponse($data, $code = 200) 
{ 
    $app = Slim::getInstance(); 
    $app->response->setStatus($code); 
    $app->response->headers->set(
     'Content-type', 
     'application/json; charset=utf-8' 
    ); 
    return $app->response->setBody(json_encode($data)); 
}