目錄
基于原生PHP交叉会员权限控制,交叉会员权限控制
1、按位与运算符(&)
2、按位或运算符(|)
PHP中怎实现交叉会员?
php框架相对原生php影响性可以或效率
首頁 後端開發 php教程 基于原生PHP交叉会员权限控制,交叉会员权限控制_PHP教程

基于原生PHP交叉会员权限控制,交叉会员权限控制_PHP教程

Jul 13, 2016 am 10:21 AM
php 會員 原生 後台 基於 控制 權限 管理

基于原生PHP交叉会员权限控制,交叉会员权限控制

对于一个网站的后台管理系统,单一的超级管理员权限往往不能满足我们的需求,尤其是对于大型网站而言,这种单一的权限会引发许许多多的问题出现。

比如:一个网站编辑,平时他只是负责公司网站的公告更新,但如果网站后台没有严格的权限限制,他是不是就可以操作到客户的一些信息,这是存在很大隐患的。

如果学过ThinkPHP框架的朋友一定知道有个东西叫RBAC,今天咱不说那个,来说说在原生PHP语言中,怎么实现交叉权限控制。

好了,话不多说,老样子,直接说原理,上代码。

 

对于权限的交叉控制可以有很多种方法实现,这里只是提供一种思路:(我采用的是二进制数的方法)

一、这里先提下按位与和按位或的运算方法:

1、按位与运算符(&)

参加运算的两个数据,按二进制位进行“与”运算。

运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1;

       即:两位同时为“1”,结果才为“1”,否则为0

例如:3&5  即 0000 0011 & 0000 0101 = 0000 0001   因此,3&5的值得1。

 

另,负数按补码形式参加按位与运算。

 

 

2、按位或运算符(|)

 

参加运算的两个对象,按二进制位进行“或”运算。

 

运算规则:0|0=0;   0|1=1;   1|0=1;    1|1=1;

 

      即 :参加运算的两个对象只要有一个为1,其值为1。

 

例如:3|5 即 0000 0011 | 0000 0101 = 0000 0111   因此,3|5的值得7。 

 

 

 

另,负数按补码形式参加按位或运算。

 

了解了按位与和按位或的运算,我们来看下面这个例子:

<span> 1</span> <?<span>php
</span><span> 2</span>     <span>define</span>('ADD',1);<span>//</span><span>二进制1</span>
<span> 3</span>     <span>define</span>('DELETE',2);<span>//</span><span>二进制10</span>
<span> 4</span>     <span>define</span>('UPDATE',4);<span>//</span><span>二进制100</span>
<span> 5</span>     <span>define</span>('SELECT',8);<span>//</span><span>二进制1000
</span><span> 6</span> 
<span> 7</span> <span>    //有权限为1,没有权限为0</span>
<span> 8</span>     <span>$admin</span>=ADD|DELETE|UPDATE|SELECT;<span>//</span><span>1111</span>
<span> 9</span>     <span>$editer</span>=ADD|UPDATE|SELECT;<span>//</span><span>1101</span>
<span>10</span>     <span>$user</span>=SELECT;<span>//</span><span>1000</span>
<span>11</span> ?>
登入後複製

我把增删改查分别做成了4个权限并定为常量

1的二进制数是1,2的二进制数是10,4的二进制数是100,8的二进制数是1000,这里刚好成一个规律

可能有些朋友会问上面权限变量admin,editer,user所对应的1111,1101,1000是怎么来的?

PHP里有一个十进制数转二进制数的函数叫decbin()

下面是对应的函数解释:

<span>decbin</span><span>
(PHP </span>3, PHP 4, PHP 5<span>)

</span><span>decbin</span> --<span> 十进制转换为二进制
说明
</span><span>string</span> <span>decbin</span> ( int <span>number</span><span> )<br /><br />
返回一字符串,包含有给定 </span><span>number</span> 参数的二进制表示。所能转换的最大数值为十进制的 4294967295,其结果为 32 个 1<span> 的字符串。 

例子 </span>1. <span>decbin</span><span>() 范例
</span><?<span>php
</span><span>echo</span> <span>decbin</span>(12) . "\n"<span>;
</span><span>echo</span> <span>decbin</span>(26<span>);
</span>?><span>  

上例将输出:
</span>1100
11010<span>
参见 </span><span>bindec</span>(),<span>decoct</span>(),<span>dechex</span>() 和 <span>base_convert</span>()。 
登入後複製

我们来测试输出看看吧:

<span> 1</span> <?<span>php
</span><span> 2</span>     
<span> 3</span>     
<span> 4</span>     <span>define</span>('ADD',1);<span>//</span><span>二进制1</span>
<span> 5</span>     <span>define</span>('DELETE',2);<span>//</span><span>二进制10</span>
<span> 6</span>     <span>define</span>('UPDATE',4);<span>//</span><span>二进制100</span>
<span> 7</span>     <span>define</span>('SELECT',8);<span>//</span><span>二进制1000
</span><span> 8</span> 
<span> 9</span> <span>    //有权限为1,没有权限为0</span>
<span>10</span>     <span>$admin</span>=ADD|DELETE|UPDATE|SELECT;<span>//</span><span>1111</span>
<span>11</span>     <span>$editer</span>=ADD|UPDATE|SELECT;<span>//</span><span>1101</span>
<span>12</span>     <span>$user</span>=SELECT;<span>//</span><span>1000</span>
<span>13</span> 
<span>14</span>     <span>echo</span> <span>decbin</span>(<span>$admin</span>)."<br/>"<span>;
</span><span>15</span>     <span>echo</span> <span>decbin</span>(<span>$editer</span>)."<br/>"<span>;
</span><span>16</span>     <span>echo</span> <span>decbin</span>(<span>$user</span>)."<br/>"<span>;
</span><span>17</span> 
<span>18</span> 
<span>19</span> ?>
登入後複製

输出结果:

那么我们就可以运用这个运算来判断权限了,1代表有权限,0代表无权限

比如:

admin(超级管理员)拥有的权限是增删改查也就是1111——>0000 1111

editer(网站编辑)拥有的权限是增,改,查也就是1101——>0000 1101

user(普通用户)只拥有浏览、查询的权限也就是1000——>0000 1000

那么我们只要对它们进行按位与运算就可以判断是否具备权限了

例如:

网站编辑权限 0000 1101 | 0000 0010(删除权限十进制为2转二进制为10)  结果:0000 0000 也就是没有具备权限

再来试试

普通用户权限 0000 1000 |0000 0001(添加权限十进制为1二进制为1)  结果:0000 0000 也一样不具备权限

超级管理员权限0000 1111 |0000 1101(网站编辑的权限)  结果:0000 1111 也就是具备了网站编辑的权限

好了看具体实例吧

我建了一个数据库,里面有2张表

一张是user用户表:

gid代表权限表的组id

一张是权限表:

flag代表增删改查的权限,可根据自己需要定义

基本配置页面:config.php

<span> 1</span> <?<span>php
</span><span> 2</span>     
<span> 3</span>     <span>define</span>('HOST','localhost'<span>);
</span><span> 4</span>     <span>define</span>('DBNAME','member'<span>);
</span><span> 5</span>     <span>define</span>('USER', 'root'<span>);
</span><span> 6</span>     <span>define</span>('PASS', ''<span>);
</span><span> 7</span> 
<span> 8</span> 
<span> 9</span>     <span>$link</span>=@<span>mysql_connect</span>(HOST,USER,PASS) or <span>die</span>('数据库连接失败'<span>);
</span><span>10</span> 
<span>11</span>     <span>mysql_select_db</span>(DBNAME,<span>$link</span><span>);
</span><span>12</span> 
<span>13</span>     <span>define</span>('ADD',1);<span>//</span><span>二进制1</span>
<span>14</span>     <span>define</span>('DELETE',2);<span>//</span><span>二进制10</span>
<span>15</span>     <span>define</span>('UPDATE',4);<span>//</span><span>二进制100</span>
<span>16</span>     <span>define</span>('SELECT',8);<span>//</span><span>二进制1000
</span><span>17</span> 
<span>18</span> <span>    //有权限为1,没有权限为0</span>
<span>19</span>     <span>$admin</span>=ADD|DELETE|UPDATE|SELECT;<span>//</span><span>1111</span>
<span>20</span>     <span>$editer</span>=ADD|UPDATE|SELECT;<span>//</span><span>1101</span>
<span>21</span>     <span>$user</span>=SELECT;<span>//</span><span>1000</span>
<span>22</span> ?>
登入後複製

登陆首页:index.html

<span> 1</span> <span><!</span><span>DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span>></span>
<span> 2</span> <span><</span><span>html </span><span>xmlns</span><span>="http://www.w3.org/1999/xhtml"</span><span> xml:lang</span><span>="en"</span><span>></span>
<span> 3</span> <span><</span><span>head</span><span>></span>
<span> 4</span>     <span><</span><span>meta </span><span>http-equiv</span><span>="Content-Type"</span><span> content</span><span>="text/html;charset=UTF-8"</span><span>></span>
<span> 5</span>     <span><</span><span>title</span><span>></span>Document<span></</span><span>title</span><span>></span>
<span> 6</span> <span></</span><span>head</span><span>></span>
<span> 7</span> <span><</span><span>body</span><span>></span>
<span> 8</span>     <span><</span><span>form </span><span>action</span><span>="action.php"</span><span> method</span><span>="post"</span><span>></span>
<span> 9</span>         账号:<span><</span><span>input </span><span>type</span><span>="text"</span><span> name</span><span>="username"</span> <span>/></span>
<span>10</span>         密码:<span><</span><span>input </span><span>type</span><span>="password"</span><span> name</span><span>="password"</span> <span>/></span>
<span>11</span>         <span><</span><span>input </span><span>type</span><span>="submit"</span><span> name</span><span>="submit"</span><span> value</span><span>="登陆"</span><span>></span>    
<span>12</span>     <span></</span><span>form</span><span>></span>    
<span>13</span> <span></</span><span>body</span><span>></span>
<span>14</span> <span></</span><span>html</span><span>></span>
登入後複製

提交页面:action.php

<span> 1</span> <?<span>php
</span><span> 2</span>     
<span> 3</span>     <span>require_once</span>('config.php'<span>);
</span><span> 4</span>     <span>$username</span>=<span>$_POST</span>['username'<span>];
</span><span> 5</span>     <span>$password</span>=<span>$_POST</span>['password'<span>];
</span><span> 6</span> 
<span> 7</span> 
<span> 8</span>     <span>$sql</span>="<span>select * from user as a,role as b where a.gid=b.gid 
</span><span> 9</span>     and a.username='<span>$username</span>' and password='<span>$password</span>'"<span>;
</span><span>10</span> 
<span>11</span>     <span>$result</span>=<span>mysql_query</span>(<span>$sql</span><span>);
</span><span>12</span>     <span>if</span>(<span>$data</span>=<span>mysql_fetch_array</span>(<span>$result</span><span>)){
</span><span>13</span>         <span>//</span><span>账号验证通过,判断对应权限
</span><span>14</span> <span>        //此处判断的是 是否具备删除权限</span>
<span>15</span>         <span>if</span>(<span>$data</span>['flag']&<span>DELETE){
</span><span>16</span>             <span>echo</span> "你有删除权限"<span>;
</span><span>17</span>         }<span>else</span><span>{
</span><span>18</span>             <span>echo</span> "你没有删除权限"<span>;
</span><span>19</span> <span>        }
</span><span>20</span> 
<span>21</span>     }<span>else</span><span>{
</span><span>22</span>         <span>echo</span> "错误账号密码"<span>;
</span><span>23</span> <span>    }
</span><span>24</span>     
<span>25</span> 
<span>26</span> ?>
登入後複製

效果图如下:

轻松搞定~

这里只是个简单的小DEMO演示,希望能起到抛砖引玉的作用,至于具体项目还需具体分析,权限控制毕竟是个很复杂的功能。

 

PHP中怎实现交叉会员?

不明白.,,...
 

php框架相对原生php影响性可以或效率

肯定会慢一点,但是这是可以接受的。因为采用框架造成的性能损失比较恒定,例如对于所有功能,使用框架和直编可能总是框架慢0.002毫秒。但是这种损失一般不需要在意。因为相对于框架的巨大好处,这种损耗是值得的。

利用框架可以大幅度提升开发效率
大幅度节约维护成本
更容易的项目交接

因此,宁可损失效率也选择框架。关于效率可以考虑升级服务器等手段来改善。

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/860055.htmlTechArticle基于原生PHP交叉会员权限控制,交叉会员权限控制 对于一个网站的后台管理系统,单一的超级管理员权限往往不能满足我们的需求,尤其是...
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

說明匹配表達式(PHP 8)及其與開關的不同。 說明匹配表達式(PHP 8)及其與開關的不同。 Apr 06, 2025 am 12:03 AM

在PHP8 中,match表達式是一種新的控制結構,用於根據表達式的值返回不同的結果。 1)它類似於switch語句,但返回值而非執行語句塊。 2)match表達式使用嚴格比較(===),提升了安全性。 3)它避免了switch語句中可能的break遺漏問題,增強了代碼的簡潔性和可讀性。

什麼是跨站點偽造(CSRF),您如何在PHP中實施CSRF保護? 什麼是跨站點偽造(CSRF),您如何在PHP中實施CSRF保護? Apr 07, 2025 am 12:02 AM

在PHP中可以通過使用不可預測的令牌來有效防範CSRF攻擊。具體方法包括:1.生成並在表單中嵌入CSRF令牌;2.在處理請求時驗證令牌的有效性。

See all articles