thinkPHP3.2 RBACによる権限管理


ここで2では自身がRBACを集積して権限管理を実現し、RBAC実現クラスはプロジェクト中のアドレスがThinkPHP/Librar/org/Util/Rbacである.class.phpは、必要な権限管理操作を統合しています.
一:表設計
thinkPHPのRbacのRbac.class.phpファイルには全部で4枚の表が提供されています.もう1枚のユーザー表は自分で作る必要があります.
以下に、私が構築した権限に関連するsqlを示します.
その中のwj_表の接頭辞を、プロジェクトの表の接頭辞に変更します.
1:権限テーブル:
CREATE TABLE IF NOT EXISTS `wj_access` (
  `role_id` SMALLINT(6) UNSIGNED NOT NULL COMMENT '  ID',
  `node_id` SMALLINT(6) UNSIGNED NOT NULL COMMENT '  ID',
  `level` TINYINT(1) NOT NULL COMMENT '  ',
  `module` VARCHAR(50) DEFAULT NULL COMMENT '  ',
  KEY `groupId` (`role_id`),
  KEY `nodeId` (`node_id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8 COMMENT='   ';

2:ノードテーブル:
CREATE TABLE IF NOT EXISTS `wj_node` (
  `id` SMALLINT(6) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '  ID',
  `name` VARCHAR(20) NOT NULL COMMENT '    ',
  `title` VARCHAR(50) DEFAULT NULL COMMENT '    ',
  `status` TINYINT(1) DEFAULT '0' COMMENT '   0   1  ',
  `remark` VARCHAR(255) DEFAULT NULL COMMENT '  ',
  `sort` SMALLINT(6) UNSIGNED DEFAULT NULL COMMENT '  ',
  `pid` SMALLINT(6) UNSIGNED NOT NULL COMMENT '    ',
  `level` TINYINT(1) UNSIGNED NOT NULL COMMENT '  ',
  PRIMARY KEY (`id`),
  KEY `level` (`level`),
  KEY `pid` (`pid`),
  KEY `status` (`status`),
  KEY `name` (`name`)
) ENGINE=MYISAM  DEFAULT CHARSET=utf8 COMMENT='   ';

3:ユーザーロールテーブル:
CREATE TABLE IF NOT EXISTS `wj_role` (
  `id` SMALLINT(6) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '  ID',
  `name` VARCHAR(20) NOT NULL COMMENT '    ',
  `pid` SMALLINT(6) DEFAULT NULL '  ID',
  `status` TINYINT(1) UNSIGNED DEFAULT NULL COMMENT '   0   1  ',
  `remark` VARCHAR(255) DEFAULT NULL COMMENT '  ',
  PRIMARY KEY (`id`),
  KEY `pid` (`pid`),
  KEY `status` (`status`)
) ENGINE=MYISAM  DEFAULT CHARSET=utf8 COMMENT='     ';

4:ユーザーロール関連表:
CREATE TABLE IF NOT EXISTS `wj_role_user` (
  `role_id` MEDIUMINT(9) UNSIGNED DEFAULT NULL COMMENT '  ID',
  `user_id` CHAR(32) DEFAULT NULL COMMENT '  ID',
  KEY `group_id` (`role_id`),
  KEY `user_id` (`user_id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8 COMMENT='       ';

5:ユーザー・テーブル:
CREATE TABLE IF NOT EXISTS `wj_user` (
  `user_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '  ID',
  `username` VARCHAR(50) NOT NULL COMMENT '   ',
  `password` VARCHAR(100) NOT NULL COMMENT '  ',
  `create_time` INT(10) DEFAULT NULL COMMENT '    ',
  `update_time` INT(10) DEFAULT NULL COMMENT '    ',
  `status` INT(1) DEFAULT NULL COMMENT '   0   1  ',
  PRIMARY KEY (`user_id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8 COMMENT='   ';

二:権限操作の一般的な構成について:
configでphpファイルの配列に追加:
//         
'LOAD_EXT_CONFIG' => 'user',

これにより、すべての権限構成をconfigに配置することができます.php同級のuser.phpファイル、user.phpファイルの構成は次のとおりです.
 true,
    //      1      2     
    'USER_AUTH_TYPE' => 1,
    //       SESSION  
    'USER_AUTH_KEY' => 'wjAuthId',
    //       
    'USER_AUTH_GATEWAY' => '?m=Admin&c=Login&a=index',
    // RBAC_DB_DSN       DSN
    //      ,C('DB_PREFIX')    
    'RBAC_ROLE_TABLE' => C('DB_PREFIX') . 'role',
    //          
    'RBAC_USER_TABLE' => C('DB_PREFIX') . 'role_user',
    //      
    'RBAC_ACCESS_TABLE' => C('DB_PREFIX') . 'access',
    //      
    'RBAC_NODE_TABLE' => C('DB_PREFIX') . 'node',
    //          
    'USER_AUTH_MODEL' => 'User',
    //       SESSION  
    'ADMIN_AUTH_KEY' => 'wjAdministrator',
    //         
    'REQUIRE_AUTH_MODULE' => '',
    //         
    'REQUIRE_AUTH_ACTION' => '',
    //         
    'NOT_AUTH_MODULE' => 'Public',
    //         
    'NOT_AUTH_ACTION' => '',
    //           
    'GUEST_AUTH_ON' => false,
    //      ID
    'GUEST_AUTH_ID' => 0,
    //       SESSION  
    'BACK_LOGIN_NAME' => 'loginBackName',
    //      SESSION  
    'BACK_USER_ROLE' => 'bakcUserRole',
    //     ID SESSION  
    'BACK_ROLE_ID' => 'backRoleId',
    //          SESSION  
    'BACK_ONLINE_TIME' => 'backOnlineTime',
    //         ,      
    'ONLINE_INTERVAL' => 180,
    //     URL
    'LOGOUT_URL' => '/test',
);

3:権限操作に関する一般的な方法:
1:Rbac::saveAccessList($authId=null);
ユーザーがログイン操作を行うときに$SESSION[C('USER_AUTH_KEY')]ではユーザーのIDを保存し、ここではユーザーが持つ役割の権限を$_に保存します.SESSION['_ACCESS_LIST']で
2:Rbac::checkAccess()
ユーザがアクセスするモジュールとメソッドに権限認証が必要かどうかを判断する
3:Rbac::AccessDecision()
ユーザーにアクセス権があるかどうかを切断します.すなわち、現在のプロジェクトモジュール操作が$_にあるかどうかを検出します.SESSION['_ACCESS_LIST']配列、つまり$SESSION['_ACCESS_LIST']配列中$SESSION'_ACCESS_LIST'現在のコントローラ'が存在するかどうか.権限がある場合はflaseに戻ります
4:Rbac::checkLogin();
ユーザーがログインしているかどうかを判断し、ログインしていない場合は指定したパスにジャンプします.
5:Rbac::getAccessList($authId)
クエリー・データベースから権限リストを返す$SESSION['_ACCESS_LIST']の値
6:Rbac::authenticate($map, $model='')
クエリー・ユーザーの条件とユーザー・テーブルを入力したMODELは、model値を送信しない場合にコンフィギュレーション・アイテムのUSER_を使用する配列を返します.AUTH_MODEL
四:権限管理の簡単な実装例:
1:ログイン:
//           
$username = I('post.username');
$password = I('post.password');
//      
$map = array();
$map['username'] = $username;
$map['status'] = array('eq', 1);
//         
$authInfo = Rbac::authenticate($map);
if (!$authInfo) {
    $this->error('     ');
}
if ($authInfo['password'] != md5($password)) {
    $this->error('    ');
}
$user_id = $authInfo['user_id'];
$role_user = new Model();
$role = $role_user->Table(C("RBAC_USER_TABLE"))->alias("user")->where("user_id=" . $user_id)->join(C("RBAC_ROLE_TABLE") . " as role ON role.id=user.role_id")->field("id,name")->find();
if (empty($role)) {
    $this->error('         ,    ');
}
//    ID SESSION  
session(C('BACK_ROLE_ID'), $role['id']);
//     SESSION  
session(C('BACK_USER_ROLE'), $role['name']);
//      SESSION  
session(C('USER_AUTH_KEY'), $authInfo['user_id']);
//      SESSION  
session(C('BACK_LOGIN_NAME'), $authInfo['username']);
//         SESSION  
session(C('BACK_ONLINE_TIME'), time());
//              
if ($role['id'] == '1') {
    //            SESSION     true
    session(C('ADMIN_AUTH_KEY'), true);
}
//       
Rbac::saveAccessList();
$this->success('    ', U('Index/index'));

2:ログイン成功後の権限チェック:
//      
Rbac::checkLogin();
//       
if (Rbac::checkAccess() && !Rbac::AccessDecision()) {
    //          session      
    if (C('RBAC_ERROR_PAGE')) {
        //         
        redirect(C('RBAC_ERROR_PAGE'));
    } else {
        if (C('GUEST_AUTH_ON')) {
            //      
        }
        //       
        $this->error(L('_VALID_ACCESS_'));
    }
}
//      ,           SESSION      
if (session(C('BACK_ONLINE_TIME')) + C('ONLINE_INTERVAL') * 60 < time()) {
    if (session('?' . C('USER_AUTH_KEY'))) {
        session('[destroy]');
        if (isset($_COOKIE[session_name()])) {
            setcookie(session_name(), '', time() - 3600, '/');
        }
        session_destroy();
    }
    $this->error('       ', U('Login/index'));
} else {
    session(C('BACK_ONLINE_TIME'), time());
}

以上のようにして、ユーザーロールの権限管理を実現できます.