Thinkphp的RBAC,基于角色的权限控制

时间:2022-06-12 16:33:46

可以观看兄弟连视频 或者网上下载资料 以下是一些文件的记录

RBAC中文权称,基于角色权限访问控制

Role-based Access Control

Full扩展包。


安全拦截器

认证管理器(识别不同的身份,你的用 户名和密码,权限是否在授权范围内)

决策访问管理器(即时模式,登陆模式)

运行身份管理(单身份,多身份管理B/S)

1,判断当前的操作(项目【应用】,模块,动作(操作))是否需要认证
2,如果需要认证(是判断用户是否登陆---跳至委托认证管理器验证身份,判断用户是否有权限访问---直接跳至无权访问页)
3,委托认证来验证用户身份
4,获取该用户的权限列表
5,判断用户是否有权限访问


THINKPHP当中的RBAC难点在于,数据库设计。而不在乎代码如何写。你都可以不用写多少代码。

很多人在数据库结构,想不明白,项目【应用】,模块,动作


节点(项目   1,模块  2,方法  3)之间的关系,你先得让用户能访问项目,模块,方法
(他们之间的关系,我们就叫做节点,如果说你需要将所有的节点全部可控制,
你就需要将所有的项目,项目下的模块,模块下的方法,全部加入到节点表当中去)

 

 

 

数据库的建立:

-- phpMyAdmin SQL Dump
-- version 3.2.2
-- http://www.phpmyadmin.net
--
-- 主机: localhost
-- 生成日期: 2011 年 01 月 27 日 03:26
-- 服务器版本: 5.1.39
-- PHP 版本: 5.2.11

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- 数据库: `videodemo`
--

-- --------------------------------------------------------

--
-- 表的结构 `think_access`
--

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,
`pid` int(11) NOT NULL,
KEY `groupId` (`role_id`),
KEY `nodeId` (`node_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- 转存表中的数据 `think_access`
--

INSERT INTO `think_access` (`role_id`, `node_id`, `level`, `module`, `pid`) VALUES
(2, 1, 1, NULL, 0),
(2, 2, 2, NULL, 1),
(2, 3, 2, NULL, 1),
(2, 4, 3, NULL, 2),
(2, 8, 3, NULL, 3),
(2, 6, 3, NULL, 2);

-- --------------------------------------------------------

--
-- 表的结构 `think_node`
--

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 AUTO_INCREMENT=12 ;

--
-- 转存表中的数据 `think_node`
--

INSERT INTO `think_node` (`id`, `name`, `title`, `status`, `remark`, `sort`, `pid`, `level`) VALUES
(1, 'admin', NULL, 1, NULL, NULL, 0, 1),
(2, 'user', NULL, 1, NULL, NULL, 1, 2),
(3, 'index', NULL, 1, NULL, NULL, 1, 2),
(4, 'index', NULL, 1, NULL, NULL, 2, 3),
(5, 'del', NULL, 1, NULL, NULL, 2, 3),
(6, 'add', NULL, 1, NULL, NULL, 2, 3),
(7, 'update', NULL, 1, NULL, NULL, 2, 3),
(8, 'index', NULL, 1, NULL, NULL, 3, 3),
(9, 'del', NULL, 1, NULL, NULL, 3, 3),
(10, 'add', NULL, 1, NULL, NULL, 3, 3),
(11, 'update', NULL, 1, NULL, NULL, 3, 3);

-- --------------------------------------------------------

--
-- 表的结构 `think_role`
--

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 AUTO_INCREMENT=3 ;

--
-- 转存表中的数据 `think_role`
--

INSERT INTO `think_role` (`id`, `name`, `pid`, `status`, `remark`) VALUES
(1, 'admin', NULL, 1, NULL),
(2, 'user', NULL, 1, NULL);

-- --------------------------------------------------------

--
-- 表的结构 `think_role_user`
--

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_role_user`
--

INSERT INTO `think_role_user` (`role_id`, `user_id`) VALUES
(1, '1'),
(2, '2'),
(2, '3');

-- --------------------------------------------------------

--
-- 表的结构 `think_user`
--

CREATE TABLE IF NOT EXISTS `think_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

--
-- 转存表中的数据 `think_user`
--

INSERT INTO `think_user` (`id`, `username`, `password`) VALUES
(1, 'admin', '21232f297a57a5a743894a0e4a801fc3'),
(2, 'user', 'ee11cbb19052e40b07aac0ca060c23ee'),
(3, 'liwenkai', '169d2dae41d971658519adef92b144f1');


配置文件:

<?php
$arr=array(
'USER_AUTH_ON'=>true,
'USER_AUTH_TYPE'=>1,// 默认认证类型 1 登录认证 2 实时认证
'USER_AUTH_KEY'=>'authId',// 用户认证SESSION标记
'ADMIN_AUTH_KEY'=>'administrator',
'USER_AUTH_MODEL'=>'User',// 默认验证数据表模型
'AUTH_PWD_ENCODER'=>'md5',// 用户认证密码加密方式
'USER_AUTH_GATEWAY'=>'/Public/login',// 默认认证网关
'NOT_AUTH_MODULE'=>'Public',// 默认无需认证模块
'REQUIRE_AUTH_MODULE'=>'',// 默认需要认证模块
'NOT_AUTH_ACTION'=>'',// 默认无需认证操作
'REQUIRE_AUTH_ACTION'=>'',// 默认需要认证操作
'GUEST_AUTH_ON' => false, // 是否开启游客授权访问
'GUEST_AUTH_ID' => 0, // 游客的用户ID
'RBAC_ROLE_TABLE'=>'think_role',
'RBAC_USER_TABLE'=>'think_role_user',
'RBAC_ACCESS_TABLE' =>'think_access',
'RBAC_NODE_TABLE'=> 'think_node',
);

$arr1=include './config.inc.php';

return array_merge($arr1,$arr);
?>

config.inc.php内容:

<?php
return array(
'DB_TYPE'=>'mysql',
'DB_HOST'=>'localhost',
'DB_NAME'=>'videodemo', //如果数据库名都相同的话,你可以不用定义多个
'DB_USER'=>'root',
'DB_PWD'=>'liwenkaihaha',
'DB_PORT'=>'3306',
'DB_PREFIX'=>'think_',

);
?>


admin.php

<?php

// 定义ThinkPHP框架路径

define('THINK_PATH', './ThinkPHP/');

//定义项目名称和路径

define('APP_NAME', 'admin');

define('APP_PATH', './admin');

// 加载框架入口文件

require(THINK_PATH."/ThinkPHP.php");

//实例化一个网站应用实例

App::run();

?>


lib下的ACTION CommonAction.class.php

<?php
//初使接口
class CommonAction extends Action{
function _initialize() {
// 用户权限检查
if (C ( 'USER_AUTH_ON' ) && !in_array(MODULE_NAME,explode(',',C('NOT_AUTH_MODULE')))) {
import ( 'ORG.Util.RBAC' );
if (! RBAC::AccessDecision ()) {
//检查认证识别号
if (! $_SESSION [C ( 'USER_AUTH_KEY' )]) {
//跳转到认证网关
redirect ( PHP_FILE . C ( 'USER_AUTH_GATEWAY' ) );
}
// 没有权限 抛出错误
if (C ( 'RBAC_ERROR_PAGE' )) {
// 定义权限错误页面
redirect ( C ( 'RBAC_ERROR_PAGE' ) );
} else {
if (C ( 'GUEST_AUTH_ON' )) {
$this->assign ( 'jumpUrl', PHP_FILE . C ( 'USER_AUTH_GATEWAY' ) );
}
// 提示错误信息
$this->error ( L ( '_VALID_ACCESS_' ) );
}
}
}
}
}

?>


 


lib下的ACTION IndexAction.class.php

<?php
// 本类由系统自动生成,仅供测试用途
class IndexAction extends CommonAction{
public function index(){
echo 'index 下面的显示';
}

function del(){
echo 'index下面的删除';
}

function add(){
echo 'index 下面的添加';
}

function update(){
echo 'index 下面的更新';
}
}
?>


lib下的ACTION PublicAction.class.php

<?php
class PublicAction extends Action{
function index(){

$this->login();
}

function login(){
$this->display();
}

function checkLogin(){
if(empty($_POST['username'])) {
$this->error('帐号错误!');
}elseif (empty($_POST['password'])){
$this->error('密码必须!');
}

//生成认证条件
$map = array();
// 支持使用绑定帐号登录
$map['username']= $_POST['username'];

import ( 'ORG.Util.RBAC' );
$authInfo = RBAC::authenticate($map);
//使用用户名、密码和状态的方式进行认证
if(false === $authInfo) {
$this->error('帐号不存在或已禁用!');
}else {
if($authInfo['password'] != md5($_POST['password'])) {
$this->error('密码错误!');
}
$_SESSION[C('USER_AUTH_KEY')]=$authInfo['id'];
if($authInfo['username']=='admin') {
$_SESSION['administrator']=true;
}


// 缓存访问权限
RBAC::saveAccessList();
$this->success('登录成功!');

}
}
function loginout(){
if(isset($_SESSION[C('USER_AUTH_KEY')])) {
unset($_SESSION[C('USER_AUTH_KEY')]);
unset($_SESSION);
session_destroy();
$this->assign("jumpUrl",__URL__.'/login/');
$this->success('登出成功!');
}else {
$this->error('已经登出!');
}
}

}

?>


UserAction.class.php

<?php
class UserAction extends CommonAction{

public function index(){
echo 'user 下面的显示';
}

function del(){
echo 'user下面的删除';
}

function add(){
echo 'user 下面的添加';
}

function update(){
echo 'user下面的更新';
}
}

?>