2013-02-27 50 views
1

即时通讯尝试学习在我的应用程序中使用按位权限。 问题是,它不工作:(按位权限不工作PHP

当用户登录时,我保存在会话的用户对象,它看起来是这样的:

[user] => User Object 
    (
     [id] => 1 
     [firstname] => Firstname 
     [lastname] => Lastname 
     [emailaddress] => [email protected] 
     [permissions] => 16 
    ) 

我有一个名为身份验证类,我在其中定义一些contants,这是这些:

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许可,它不是一个管理员,它应该说没有联系..但它并不总是说是的管理员..

可能用户有人告诉我我在这里做错了什么?

谢谢!

+4

那些......不是按位。那些是十进制的。 (十分明智?)此外,我不认为你没有检查按位权限 - 它应该是'perm&required_perm === required_perm'。 (尽管可能不是。)PHP 5.4+支持'0b0101'形式的二进制文字符号。 – 2013-02-27 19:22:42

+0

根据http://stackoverflow.com/questions/132194/php-storing-objects-inside-the-session在'$ _SESSION'中存储对象通常不是一个好主意。 – Mike 2013-02-27 19:39:59

回答

5

这也许应该是

const GUEST = 1;  // 1 
const USER = 2;  // 10 
const MODERATOR = 8; // 1000 
const ADMIN = 16; // 10000 
+0

而当用户是管理员我必须添加10000到数据库的权限字段? – user1362916 2013-02-27 19:24:18

+1

@ user1362916你知道什么是二进制数吗? – 2013-02-27 19:29:35

+0

不,不是真的我试图理解哈哈 – user1362916 2013-02-27 21:05:48

5

问题,as Mikhail shows,是1000是数一千。你需要二进制表示为1000的数字,这是数字8。

您可以使用1,2,4,8,16等,正如Mikhail所做的那样。

但是,如果您想要查看按位计算发生的情况,如果您可以看到位在哪里可视化,那就太好了。 PHP 5.4引入了二进制整数语法。

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