按位权限不起作用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的数字,也就是数字八。

您可以像米哈伊尔一样使用124816 等。

但是,如果您想可视化按位计算发生的情况,最好能直观地看到位的位置。 PHP 5.4 引入了二进制整数语法。

const GUEST     = 0b00001;  // 1
const USER      = 0b00010;  // 2
const MODERATOR = 0b01000;  // 8
const ADMIN     = 0b10000;  // 16

【讨论】:

以上是关于按位权限不起作用PHP的主要内容,如果未能解决你的问题,请参考以下文章

PHPthumb不起作用-不显示图像

PHP to LOAD DATA LOCAL INFILE 不起作用

PHP.INI不起作用

Laravel 5 - 会话不起作用

修改php.ini不起作用是为啥

权限不起作用