ホームページ >バックエンド開発 >PHPチュートリアル >ネイティブ PHP に基づくメンバー間権限制御、メンバー間権限制御_PHP チュートリアル
Web サイトのバックエンド管理システムの場合、特に大規模な Web サイトの場合、単一のスーパー管理者権限ではニーズを満たすことができないことが多く、この単一の権限が多くの問題を引き起こす可能性があります。
例: Web サイト編集者は、通常、会社の Web サイトの発表と更新のみを担当しますが、Web サイトのバックエンドに厳格な権限制限がない場合、顧客の情報の一部を操作することができます。これは大きな隠れた問題です。危険。
ThinkPHP フレームワークを学習したことがある場合は、RBAC と呼ばれるものがあることを知っているはずです。今日はそれについては説明しませんが、ネイティブ PHP 言語で権限間の制御を実装する方法について話しましょう。
さて、あまり言うことはありません。いつものように原則とコードについて話しましょう。
アクセス許可の相互制御を実装する方法はたくさんあります。ここでは 1 つのアイデアを紹介します: (私は 2 進数の方法を使用します)。
1. ここでは、まずビットごとの AND とビットごとの OR の演算方法について説明します。 1. ビット単位の 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 演算子 (|)
操作ルール: 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演示,希望能起到抛砖引玉的作用,至于具体项目还需具体分析,权限控制毕竟是个很复杂的功能。
不明白.,,...
肯定会慢一点,但是这是可以接受的。因为采用框架造成的性能损失比较恒定,例如对于所有功能,使用框架和直编可能总是框架慢0.002毫秒。但是这种损失一般不需要在意。因为相对于框架的巨大好处,这种损耗是值得的。
利用框架可以大幅度提升开发效率
大幅度节约维护成本
更容易的项目交接
因此,宁可损失效率也选择框架。关于效率可以考虑升级服务器等手段来改善。