ホームページ >バックエンド開発 >PHPチュートリアル >ネイティブ PHP に基づくメンバー間権限制御、メンバー間権限制御_PHP チュートリアル

ネイティブ PHP に基づくメンバー間権限制御、メンバー間権限制御_PHP チュートリアル

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-07-13 10:21:18896ブラウズ

ネイティブ PHP のメンバー間権限制御、メンバー間権限制御に基づいています

Web サイトのバックエンド管理システムの場合、特に大規模な Web サイトの場合、単一のスーパー管理者権限ではニーズを満たすことができないことが多く、この単一の権限が多くの問題を引き起こす可能性があります。

例: Web サイト編集者は、通常、会社の Web サイトの発表と更新のみを担当しますが、Web サイトのバックエンドに厳格な権限制限がない場合、顧客の情報の一部を操作することができます。これは大きな隠れた問題です。危険。

ThinkPHP フレームワークを学習したことがある場合は、RBAC と呼ばれるものがあることを知っているはずです。今日はそれについては説明しませんが、ネイティブ PHP 言語で権限間の制御を実装する方法について話しましょう。

さて、あまり言うことはありません。いつものように原則とコードについて話しましょう。

アクセス許可の相互制御を実装する方法はたくさんあります。ここでは 1 つのアイデアを紹介します: (私は 2 進数の方法を使用します)。

1. ここでは、まずビットごとの AND とビットごとの OR の演算方法について説明します。 1. ビット単位の AND 演算子 (&)

演算に参加する 2 つのデータは、バイナリ ビットに従って AND 演算されます。

操作ルール: 0&0=0; 1&1=1;

つまり、両方ともビットが同時に「1」であれば結果は「1」、それ以外の場合は0になります

例: 3&5 は 0000 0011 & 0000 0101 = 0000 0001 したがって、3&5 は 1 の価値があります。

さらに、負の数値は 2 の補数形式でビット単位の AND 演算に参加します。

2. ビット単位の OR 演算子 (|)

操作に参加する 2 つのオブジェクトは、バイナリ ビットに基づいて「OR」操作を実行します。

操作ルール: 0|0=0; 1|1=1;

つまり、操作に参加する 2 つのオブジェクトのうちの 1 つが 1 である限り、その値は 1 です。

例: 3|5 つまり、0000 0011 | 0000 0101 = 0000 0111 したがって、3|5 は 7 の価値があります。

さらに、負の数値は補数形式でビットごとの OR 演算に参加します。

ビットごとの AND とビットごとの OR の演算を理解して、次の例を見てみましょう:

リーリー

それぞれ追加、削除、変更、確認の4つの権限を作成し、定数として設定しました 二進数の 1 は 1、二進数の 2 は 10、二進数の 4 は 100、二進数の 8 は 1000、これは単なるルールです 上記の権限変数 admin、editor、user に対応する 1111、1101、および 1000 はどこから来たのかを尋ねる友人もいるかもしれません。

PHPにはdecbin()という10進数を2進数に変換する関数があります

以下は対応する機能の説明です:

リーリー

出力をテストして見てみましょう:

リーリー

出力結果:

次に、この操作を使用して権限を決定します。1 は権限があることを意味し、0 は権限がないことを意味します

例:

管理者(スーパー管理者)の権限は、追加、削除、変更、確認であり、1111——>0000 1111です

editor (Web サイト編集者) には、追加、変更、確認する権限があります。これは 1101——>0000 1101 です

ユーザー (一般ユーザー) には閲覧とクエリの権限のみがあり、1000—>0000 1000 です

その後、それらに対して

ビット単位の AND 演算

を実行して、許可があるかどうかを判断するだけです

例:

ウェブサイトの編集権限 0000 1101 | 0000 0010 (削除権限は 10 進数の 2 から 2 進数の 10 に変換されます) : 0000 0000、権限がないことを意味します

もう一度試してください

通常のユーザー権限 0000 1000 |0000 0001 (10 進数の権限を 1 に、2 進数の権限を 1 に加算します) 結果: 0000 0000 にも権限がありません

スーパー管理者権限 0000 1111 | 0000 1101 (Web サイト編集権限) 結果: 0000 1111、Web サイト編集権限があることを意味します

それでは、具体的な例を見てみましょう 2つのテーブルを含むデータベースを構築しました

1 つはユーザー テーブルです:

gidは権限テーブルのグループIDを表します

1 つは許可テーブルです:

フラグは追加、削除、変更、確認の権限を表し、必要に応じて定義できます

基本配置页面: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 までご連絡ください。