
在现代web应用中,根据用户身份展示个性化数据是一项常见需求。例如,一个招聘平台可能需要只显示当前用户发布的职位列表,而不是所有职位。本教程将介绍如何利用javascript在客户端实现这一功能,并深入探讨其局限性与更安全的后端实现策略。
假设我们已经通过AJAX请求从后端获取了所有招聘信息数据,并希望在前端HTML表格中仅显示由当前登录用户创建的记录。
1. 获取当前用户ID
首先,我们需要在JavaScript中获取当前登录用户的唯一标识符。这个ID可能通过多种方式提供,例如:
以下代码片段演示了如何从一个带有特定属性的HTML元素中提取用户ID:
立即学习“前端免费学习笔记(深入)”;
// 假设您的HTML中有一个元素,其data-ms-member="id"属性包含了当前用户的ID
const currentUserIDElement = document.querySelector('[data-ms-member="id"]');
const currentUserID = currentUserIDElement ? currentUserIDElement.textContent.trim() : null;
if (!currentUserID) {
console.error("无法获取当前登录用户ID,请确保用户已登录且ID可用。");
// 如果无法获取用户ID,通常应停止后续的数据加载和显示操作
// 或者显示一个错误消息给用户
}2. 遍历数据并应用过滤逻辑
获取到当前用户ID后,我们可以在处理从数据库获取的数据时,对每一条记录进行比较。如果记录的 createdByUserID 字段与 currentUserID 不匹配,则跳过该记录,不将其渲染到HTML表格中。
下面是修改后的JavaScript代码,包含了过滤逻辑:
$(function() {
// 假设这里已成功获取到当前登录用户的ID
const currentUserIDElement = document.querySelector('[data-ms-member="id"]');
const currentUserID = currentUserIDElement ? currentUserIDElement.textContent.trim() : null;
if (!currentUserID) {
// 如果无法获取用户ID,则停止执行后续逻辑
console.error("错误:无法获取当前登录用户ID。");
return;
}
$.getJSON('https://db-ommitted-for-privacy?tableName=JobListings&fields=company,logo,img,companyDescription,role,roleDescription,location,link,createdByUserID,dateAdded&view=AllListings', function(data) {
// 确保data.records存在且是数组
if (!data || !Array.isArray(data.records)) {
console.error("从API获取的数据格式不正确或为空。");
return;
}
$.each(data.records, function(i, { fields: f }) {
// 核心过滤逻辑:如果数据项的创建者ID与当前用户ID不匹配,则跳过当前循环迭代
// 注意:在jQuery.each中,返回 true 相当于 continue,返回 false 相当于 break。
if (currentUserID !== f.createdByUserID) {
return true; // 跳过当前记录,继续处理下一条
}
// 构建表格行内容
var tblRow = "<tr>" +
"<td>" +
"<div style='padding-top: 1%; padding-bottom: 1%;'>" +
"<div style='border: 1px solid black;'>" +
"<button class='accordionList' style='font-size: large; outline: none;'>" +
"<span style='padding-top: 2.5%; padding-bottom: 3%;'>" +
"<img src='" + f.logo + "' height='30px'>" +
"</span> <span style='padding-top: 3%; padding-bottom: 3%;'> " +
f.company + " | " + f.role +
" <span style='color: #2b2b2b;''><span class='iconify-inline' data-icon='eva:pin-outline' style='color: #2b2b2b;'></span> " + f.location +"</span></span>" +
"</button>" +
"<div class='panel'>" +
"<img src='img/jobBanner2.png' width='100%'>" +
"<br>" +
"<p style='color: #505050;'>Posted: " + f.dateCreated + " | Status: " + f.status + "</p>" +
"<h4>About this role:</h4>" +
"<p>" + f.roleDescription + "</p>" +
"<h4>About " + f.company + ":</h4>" +
"<p>" + f.companyDescription + "</p>" + "<br>" +
"<a href='pricing.html' class='button btn btn-lg btn-block btn-sm button-black' style='padding-top: 1%; padding-bottom: 1%; width: 200px;'>Apply <span class='iconify-inline' data-icon='bi:arrow-right-circle' data-width='15' style='color: white;'></span></a>" +
"<br>" + "</div>" +
"</div>" +
"</div>" +
"</div>" +
"</td>" +
"</tr>";
$(tblRow).appendTo("#userdata tbody");
});
}).fail(function(jqXHR, textStatus, errorThrown) {
console.error("API请求失败: " + textStatus, errorThrown);
// 可以向用户显示一个友好的错误消息
});
});尽管上述方法可以实现前端数据显示过滤,但在实际生产环境中,这种做法存在严重的安全和性能隐患,因此不建议用于处理敏感数据或大规模数据集。
1. 安全性风险
2. 性能问题
为了彻底解决上述安全和性能问题,最佳实践是在服务器端进行数据过滤。这意味着在数据离开服务器之前,就根据当前用户的身份和权限进行筛选。
后端过滤的优势:
后端过滤的实现思路:
无论是使用PHP、Node.js、Python(如Django/Flask)、Java或其他后端技术栈,都应遵循这一原则。
客户端JavaScript过滤虽然能快速实现数据展示的个性化需求,但其固有的安全漏洞和性能瓶颈使其不适合用于生产环境,尤其当涉及敏感数据或大量数据时。对于任何需要基于用户身份进行数据访问控制的场景,强烈建议采用后端过滤机制,以确保数据安全、提升系统性能并优化用户体验。在开发过程中,始终优先考虑数据安全,将权限控制逻辑放在服务器端执行是构建健壮可靠应用的基石。
以上就是前端数据展示:基于用户ID过滤数据库记录的实践与安全考量的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号