thinkPHP3.2 RBACによる権限管理
ここで2では自身がRBACを集積して権限管理を実現し、RBAC実現クラスはプロジェクト中のアドレスがThinkPHP/Librar/org/Util/Rbacである.class.phpは、必要な権限管理操作を統合しています.
一:表設計
thinkPHPのRbacのRbac.class.phpファイルには全部で4枚の表が提供されています.もう1枚のユーザー表は自分で作る必要があります.
以下に、私が構築した権限に関連するsqlを示します.
その中のwj_表の接頭辞を、プロジェクトの表の接頭辞に変更します.
1:権限テーブル:
2:ノードテーブル:
3:ユーザーロールテーブル:
4:ユーザーロール関連表:
5:ユーザー・テーブル:
二:権限操作の一般的な構成について:
configでphpファイルの配列に追加:
これにより、すべての権限構成をconfigに配置することができます.php同級のuser.phpファイル、user.phpファイルの構成は次のとおりです.
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:ログイン:
2:ログイン成功後の権限チェック:
以上のようにして、ユーザーロールの権限管理を実現できます.
一:表設計
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());
}
以上のようにして、ユーザーロールの権限管理を実現できます.