如何在AngularJS+PHP项目中获取MySQL特定ID数据并实现权限控制
解决方案:实现登录用户仅操作自身数据的权限控制
嘿,我来帮你一步步搞定这个问题!核心思路是后端精准返回当前用户的数据+前端根据登录状态控制操作权限,同时必须做好后端的安全校验,避免前端篡改数据绕过权限。
1. 先搞定登录状态的传递(获取当前用户唯一标识)
首先你需要在用户登录成功后,把用户的唯一标识(比如user_id,或者你表中用来区分用户的trainer_code)存入PHP Session,比如:
// 登录验证通过后执行 session_start(); $_SESSION['logged_in_user_id'] = $user_id; // 替换成你实际的用户唯一标识字段
2. 修改后端Details.php:只返回当前登录用户的数据
现在你的Details.php是返回全表数据,我们要改成仅返回当前登录用户的记录——这是最关键的安全步骤,不能依赖前端过滤:
<?php session_start(); // 先检查用户是否登录,未登录直接返回空数据 if(!isset($_SESSION['logged_in_user_id'])){ echo json_encode([]); exit; } require_once 'database_connections.php'; // 假设你的pokedstats表用user_id关联登录用户,替换成你实际的关联字段 $current_user_id = $_SESSION['logged_in_user_id']; // 使用预处理语句防止SQL注入 $query = "SELECT * from pokedstats WHERE user_id = ?"; $stmt = mysqli_prepare($con, $query); // 如果是字符串类型的标识,把"i"改成"s" mysqli_stmt_bind_param($stmt, "i", $current_user_id); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $arr = array(); if(mysqli_num_rows($result) != 0) { while($row = mysqli_fetch_assoc($result)) { $arr[] = $row; } } echo json_encode($arr); ?>
3. 前端优化:控制编辑/删除按钮的显示(提升用户体验)
如果需要更友好的交互,可以在AngularJS中先获取当前用户信息,然后用ng-show控制按钮的显示,同时在操作函数里加权限校验:
第一步:修改controller.js获取当前用户信息
var crudApp = angular.module('crudApp',[]); crudApp.controller("DbController",['$scope','$http', function($scope,$http){ // 先获取当前登录用户的信息(需要你写一个getCurrentUser.php接口返回用户基本数据) $http.get('databaseFiles/getCurrentUser.php').success(function(userData){ $scope.currentUser = userData; // 拿到用户信息后再加载数据 getInfo(); }); function getInfo(){ $http.post('databaseFiles/Details.php').success(function(data){ $scope.details = data; }); } // 编辑函数加权限校验 $scope.editInfo = function(detail){ if(detail.user_id !== $scope.currentUser.user_id){ alert('你没有权限编辑这条数据!'); return; } // 这里放原来的编辑逻辑 }; // 删除函数加权限校验 $scope.deleteInfo = function(detail){ if(detail.user_id !== $scope.currentUser.user_id){ alert('你没有权限删除这条数据!'); return; } // 这里放原来的删除逻辑 }; }]);
第二步:修改index.php的按钮显示逻辑
<tr ng-repeat="detail in details| filter:search_query"> <td>{{$index + 1}}</td> <td>{{detail.trainer_name}}</td> <td>{{detail.trainer_team}}</td> <td>{{detail.trainer_code}}</td> <td> <button class="btn btn-warning" ng-click="editInfo(detail)" title="Edit" ng-show="detail.user_id == currentUser.user_id"> <span class="glyphicon glyphicon-edit"></span> </button> </td> <td> <button class="btn btn-danger" ng-click="deleteInfo(detail)" title="Delete" ng-show="detail.user_id == currentUser.user_id"> <span class="glyphicon glyphicon-trash"></span> </button> </td> </tr>
4. 最后补全安全漏洞:编辑/删除接口也要加权限校验
不要忘了在你的编辑、删除接口(比如Edit.php、Delete.php)里也加上Session校验和权限判断,确保用户只能操作自己的数据,比如删除接口示例:
<?php session_start(); if(!isset($_SESSION['logged_in_user_id'])){ echo json_encode(['status' => 'error', 'msg' => '请先登录']); exit; } require_once 'database_connections.php'; $current_user_id = $_SESSION['logged_in_user_id']; $target_id = $_POST['detail_id']; // 前端传递的要删除的记录ID // 先验证这条记录是否属于当前用户 $check_query = "SELECT user_id FROM pokedstats WHERE id = ?"; $stmt = mysqli_prepare($con, $check_query); mysqli_stmt_bind_param($stmt, "i", $target_id); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $row = mysqli_fetch_assoc($result); if($row['user_id'] != $current_user_id){ echo json_encode(['status' => 'error', 'msg' => '无权限删除该数据']); exit; } // 执行删除操作 $delete_query = "DELETE FROM pokedstats WHERE id = ?"; $stmt = mysqli_prepare($con, $delete_query); mysqli_stmt_bind_param($stmt, "i", $target_id); mysqli_stmt_execute($stmt); echo json_encode(['status' => 'success', 'msg' => '删除成功']); ?>
这样一套流程下来,就能实现登录用户只能看到和操作自身数据的需求了,后端校验是核心,前端控制只是提升用户体验~
内容的提问来源于stack exchange,提问作者Sai Kiran
相关产品推荐
相关产品推荐

