通过一天的努力,终于把ThinkPHP的RBAC类弄明白了,如今记录下来,成果与你们分享。要想获得更详尽的信息,还须要去查看RBAC类的源代码。node
首先须要使用5张数据表,关系图以下:sql
这五张表的英文名是任意的,只需修改相应的配置项就能够,默认的英文名分别为:用户表(think_user)、用户组表(think_role)、节点表(think_node)、用户与用户组关系表(think_role_user)、权限表(think_access)。数据库
生成他们的sql语句以下(复制粘贴的):app
CREATE TABLE IF NOT EXISTS `think_access` ( `role_id` smallint(6) unsigned NOT NULL, `node_id` smallint(6) unsigned NOT NULL, `level` tinyint(1) NOT NULL, `module` varchar(50) DEFAULT NULL, KEY `groupId` (`role_id`), KEY `nodeId` (`node_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `think_node` ( `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `title` varchar(50) DEFAULT NULL, `status` tinyint(1) DEFAULT '0', `remark` varchar(255) DEFAULT NULL, `sort` smallint(6) unsigned DEFAULT NULL, `pid` smallint(6) unsigned NOT NULL, `level` tinyint(1) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `level` (`level`), KEY `pid` (`pid`), KEY `status` (`status`), KEY `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `think_role` ( `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `pid` smallint(6) DEFAULT NULL, `status` tinyint(1) unsigned DEFAULT NULL, `remark` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `pid` (`pid`), KEY `status` (`status`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;CREATE TABLE IF NOT EXISTS `think_role_user` ( `role_id` mediumint(9) unsigned DEFAULT NULL, `user_id` char(32) DEFAULT NULL, KEY `group_id` (`role_id`), KEY `user_id` (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
注意其中没有think_user表的生成语句,这张表在你编写“用户模型(User Model)”时自行建立,由于RBAC类不作相似于登陆时用户名、密码是否匹配的工做。换句话说,检查用户名、密码是否匹配,该用户能不能成功登陆的代码是你写的,你须要在用户成功登陆后,将这个用户的ID写到相应的SESSION里,普通用户的写到$_SESSION[C('USER_AUTH_KEY')]里,管理员的写到$_SESSION[C('ADMIN_AUTH_KEY')]里。code
接下来要说明的是几个相关的配置项: ci
// ADMIN_AUTH_KEY 管理员认证SESSION标记 // USER_AUTH_KEY 用户认证SESSION标记 // // $_SESSION[C('USER_AUTH_KEY')] 用来保存登录成功后的用户ID // $_SESSION[C('ADMIN_AUTH_KEY')] 用来保存登录成功后的管理员ID // // USER_AUTH_ON 是否须要认证 // USER_AUTH_TYPE 认证类型,1是登录认证,2是实时认证 // USER_AUTH_MODEL 用户模型名称 // GUEST_AUTH_ON 是否开启游客受权访问 // GUEST_AUTH_ID 游客的用户ID // // REQUIRE_AUTH_MODULE 须要认证模块(若定义了,则只验证给出的模块;不然验证全部模块) // NOT_AUTH_MODULE 无需认证模块(若定义了“须要认证模块”则本条定义无效) // REQUIRE_AUTH_ACTION 须要认证操做(若定义了,则只验证给出的操做;不然验证全部操做) // NOT_AUTH_ACTION 无需认证操做(若定义了“须要认证操做”则本条定义无效) // // USER_AUTH_GATEWAY 认证网关,若是用户没有登陆则转到这页(URL路由规则) // RBAC_DB_DSN 数据库链接DSN // RBAC_ROLE_TABLE 角色表名称 // RBAC_USER_TABLE 用户表名称(应该是用户、用户组关系表) // RBAC_ACCESS_TABLE 权限表名称 // RBAC_NODE_TABLE 节点表名称
在定义了这几项以后,就能够调用RBAC类中的方法了,这些方法的声明及解释以下:路由
1.rem
static public function authenticate($map,$model='')
根据map中指定的条件查询“用户模型”,返回符合条件的数据。其实就是M(User)->where($map)->find()。get
2.it
static function saveAccessList($authId=null)
检测当前用户的全部权限,并将这些拥有的权限保存在$_SESSION['_ACCESS_LIST']中,不返回任何东西。开销很大,是对RBAC::getAccessList的默认参数封装。
3.
static function getRecordAccessList($authId=null,$module='')
检测当前用户在当前模块中所拥有的权限,并将这些权限返回。开销很大,是对getModuleAccessList的默认参数封装。
4.
static function checkAccess()
检查当前操做是否须要认证,须要认证则返回true,不须要则返回false.
5.
static public function checkLogin()
检查用户是否登陆。若是没有登陆,则尝试进行“游客”登陆;若是没有开启以游客身份登陆,则跳转到认证网关。登陆成功将返回true。
6.
static public function AccessDecision($appName=APP_NAME)
权限认证的过滤器方法,检查当前操做是否被容许,返回bool值。
7.
static public function getAccessList($authId)
取得指定用户的权限列表。
8.
static public function getModuleAccessList($authId,$module)
取得指定用户、指定模块的权限列表。