按位权限不起作用PHP
Posted
技术标签:
【中文标题】按位权限不起作用PHP【英文标题】:bitwise permissions not working PHP 【发布时间】:2013-02-13 18:12:52 【问题描述】:我正在尝试学习在我的应用程序中使用按位权限。 问题是,它不工作:(
当用户登录时,我在会话中保存一个用户对象,如下所示:
[user] => User Object
(
[id] => 1
[firstname] => Firstname
[lastname] => Lastname
[emailaddress] => email@adres
[permissions] => 16
)
我有一个名为 authenticate 的类,我在其中定义了一些内容,它们是:
class authenticate
const GUEST = 1; // 1
const USER = 10; // 2
const MODERATOR = 1000; // 8
const ADMIN = 10000; // 16
现在,当用户登录管理员时,我想确保用户具有管理员权限,我尝试通过这种方式进行检查:
if ($_SESSION['user']->permissions & authenticate::ADMIN)
echo 'yep admin';
else
echo 'no admin';
当我有一个用户确实可以说拥有数字 8 作为权限时,它不是管理员,它应该说没有管理员.. 但它并不总是说是管理员..
谁能告诉我我在这里做错了什么?
谢谢!
【问题讨论】:
那些...不是按位的。这些是十进制的。 (十位?)此外,我认为您没有检查按位权限 - 它应该是perm & required_perm === required_perm
。 (虽然可能不是。)php 5.4+ 支持0b0101
形式的二进制文字表示法。
根据***.com/questions/132194/…,将对象存储在$_SESSION
中通常不是一个好主意。
【参考方案1】:
应该是这样
const GUEST = 1; // 1
const USER = 2; // 10
const MODERATOR = 8; // 1000
const ADMIN = 16; // 10000
【讨论】:
当用户是管理员时,我必须在数据库的权限字段中添加 10000? @user1362916 你知道什么是二进制数吗?【参考方案2】:as Mikhail shows 的问题在于,1000
是一千。你需要二进制表示为1000
的数字,也就是数字八。
您可以像米哈伊尔一样使用1
、2
、4
、8
、16
等。
但是,如果您想可视化按位计算发生的情况,最好能直观地看到位的位置。 PHP 5.4 引入了二进制整数语法。
const GUEST = 0b00001; // 1
const USER = 0b00010; // 2
const MODERATOR = 0b01000; // 8
const ADMIN = 0b10000; // 16
【讨论】:
以上是关于按位权限不起作用PHP的主要内容,如果未能解决你的问题,请参考以下文章