PHP 如何做权限控制

在做网站或小程序的时候,你有没有遇到过这种情况:明明是同一个页面,普通用户能看到的内容和管理员看到的完全不一样?比如普通用户只能看自己的订单,管理员却能修改所有订单信息;再比如,有些后台功能只能公司老板点,普通员工点了就跳回首页。这种让不同身份的人看到不同内容、做不同操作的设置,其实就是我们常说的“权限控制”。对用PHP开发的网站来说,实现权限控制并不复杂,今天就用大家能听懂的例子,把这个事说清楚。

先给用户贴“身份标签”:这是权限控制的基础

要做权限,首先得知道“谁在操作”,就像你去超市,收银员一看你是会员,就给你打折扣,不是会员就只能原价。在PHP里,我们一般是在用户登录的时候,把“身份信息”存在会话(Session)里,这就相当于给用户贴了一张“身份标签”,不管用户打开多少页面,服务器都能认出他是谁。

PHP 如何做权限控制

举个例子:用户登录成功后,PHP会把他的用户ID、身份类型(普通用户/管理员)存进Session:

`php

// 登录成功后设置Session

session_start();

$_SESSION['user_id'] = 123; // 用户ID,随便举的例子

$_SESSION['role'] = 'admin'; // 身份是管理员

`

如果是普通用户,这里的role就会写成'user',就像你去银行,柜员看你是普通客户,就只能给你办存取款,要是VIP客户,还能办理财业务。这一步是基础,要是连用户身份都不知道,根本没法谈权限控制。

页面级权限:不让人看不该看的页面

有了身份标签,接下来就能控制“能不能看某个页面”了,这是最常用的权限控制方式,比如后台管理页面,普通员工根本不该打开,直接给拦在外面。

还是用例子说:你做了一个“订单管理”页面,只有管理员能进,那在这个页面的最开头,先检查一下用户的身份标签就行:

`php

session_start();

// 先判断用户有没有登录,没登录就跳去登录页

if (!isset($_SESSION['role'])) {

header('Location: login.php');

exit;

}

// 再判断身份是不是管理员,不是就跳去首页

if ($_SESSION['role'] !== 'admin') {

header('Location: index.php');

exit;

}

// 要是都通过了,才显示订单管理页面的内容

`

这就像你进小区,保安先看你有没有门禁卡,再看你是不是业主,不是的话直接不让进,连小区大门都到不了。这个方式简单好操作,适合大部分普通权限需求。

功能级权限:同一个页面,只给你能做的操作

有时候同一个页面,就算是同身份的人,也可能有不同权限。比如订单页面,管理员能修改、删除订单,普通用户只能看自己的订单,连修改按钮都看不到。这就是功能级的权限控制,比页面级更细。

举个例子:在订单页面里,先判断当前用户是不是这个订单的所有者,或者有没有管理员权限,再决定显示哪些按钮:

`php

// 假设我们已经从数据库拿到了当前订单的信息,比如订单的user_id是456

$order_user_id = 456;

// 先判断用户登录状态,再判断身份或订单归属

if ($_SESSION['role'] === 'admin' || $_SESSION['user_id'] === $order_user_id) {

// 显示修改、删除按钮

echo '<button>

echo '<button>

} else {

// 只显示查看按钮

echo '您无权限操作该订单';

}

`

这就像你去餐厅吃饭,服务员给你菜单,你只能点自己桌的菜,要是想点隔壁桌的,服务员根本不理你,哪怕你是餐厅经理,也不会随便改其他桌的订单。

细节要注意,别让权限“漏了”

最后要提醒大家几个容易踩的小坑,不然权限控制可能白做了。比如刚才说的Session,要是用户禁用了Cookie,Session就存不住,这时候可以用URL参数传用户ID,但一定要加密,不然别人改个参数就能冒充管理员;还有,千万别只在前端做权限,比如把按钮藏起来,就算前端隐藏了,用户只要复制页面地址,或者改前端代码,还是能操作,所以一定要在PHP的后端做判断,这才是最靠谱的。

总的来说,PHP做权限控制就这几步:先给用户贴身份标签,再按页面、功能分级判断,最后把判断做在后端,就像给网站装了一道层层把关的门,只有符合规则的人,才能进到该进的地方,做该做的事。

上一篇 C / C++ 编程语言入门必知的核心特性与常见应用场景科普