rbac 权限控制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rbac 权限控制相关的知识,希望对你有一定的参考价值。

RBAC 的控制,大致是通过将角色的权限控制,来控制用户的权限.

需要构建的表为 用户表(user) ,角色表(role),节点表(node),三张主表 , 节点表内记录的是所有的权限和方法.

2张关联表,是为了关联3张数据表的,分别未 角色用户表(user_role),角色权限表(role_node),也可将两张表写成字段分别加入到用户表和权限表内;

废话不多说看下,键表语句如下

 用户表:

CREATE TABLE `wj_admin` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `account` varchar(20) DEFAULT NULL COMMENT 账户名,
  `password` varchar(255) DEFAULT NULL COMMENT 密码,
  `email` varchar(100) DEFAULT NULL COMMENT 邮箱,
  `role_id` int(11) DEFAULT NULL   COMMENT角色id,
  `create_time` int(11) DEFAULT NULL,
  `update_time` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

角色表:

CREATE TABLE `wj_role` (
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL COMMENT 角色名,
  `node_id` varchar(255) DEFAULT NULL COMMENT 节点id,
  `create_time` int(11) DEFAULT NULL,
  `update_time` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

 

权限表:

CREATE TABLE `wj_node` (
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL COMMENT 节点名,
  `c_name` varchar(255) NOT NULL COMMENT 控制器名,
  `f_name` varchar(255) DEFAULT NULL COMMENT 方法名,
  `parent_id` int(6) DEFAULT 0 COMMENT 父id,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

我没有写关联表,写成了字段,所以取数据时候需要掉一个方法将节点和方法分开

展示数据

wj_role

技术分享

wj_node

技术分享

 

登录的时候判断是否有权限操作,我这里将权限判断卸载model层中 

基础类

技术分享
 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: cheny
 5  * Date: 2017/8/22
 6  * Time: 21:10
 7  */
 8 
 9 namespace app\\admin\\controller;
10 use think\\Controller;
11 use think\\Request;
12 use think\\Session;
13 use think\\Url;
14 
15 /**
16  * Class Base
17  * 基础类
18  */
19 class Base extends controller
20 {
21     //Request实例
22     protected $request;
23 
24     /**
25      * 构造函数
26      * Base constructor.
27      * @param Request|null $request
28      */
29     public function __construct(Request $request = null)
30     {
31         parent::__construct($request);
32         //直接实例化request类方便后期调用
33         $this->request = $request;
34         if(!Session::get("id")){
35             $this->error(‘请先登录‘,Url::build("login/index"));
36         }
37         //获取权限
38         $pri=Session::get("node");
39 //
40 //        //当前模块、控制器、方法
41 
42         $controller =mb_strtolower($this->request->controller());
43         $action =mb_strtolower($this->request->action());
44         $now= url();
45 //
46 //        如果是首页相关的模块是允许查看的
47         if(($controller=="index")){
48             return;
49         }
50 
51 //        //权限判断 无权限无法操作
52         if($pri!="*" && !in_array($now,$pri)){
53             exit($this->permissionDeny());
54         }
55 //
56     }
57     /**
58      * 提示权限不足信息
59      * @return \\think\\response\\View
60      */
61     public function permissionDeny()
62     {
63         return $this->error(‘没有权限‘,Url::build("index/index1"));
64     }
65 }
View Code

Model层

技术分享
<?php
/**
 * Created by PhpStorm.
 * User: cheny
 * Date: 2017/9/3
 * Time: 14:39
 */

namespace app\\admin\\Model;


use think\\Model;
use think\\Session;
use think\\Url;
use app\\admin\\Model\\Role;
use app\\admin\\Model\\Node;


/**
 * Class Admin
 * @package app\\admin\\Model
 */
class Admin extends Model
{
    protected $table =‘wj_admin‘;
    protected $pk = ‘id‘;
    protected $autoWriteTimestamp = true;

    //检查用户是否登录

    /**
     * @param $userArr
     * @return string
     */
    public function checkLogin($userArr)
    {

        $admin = self::get([‘account‘ => $userArr[‘account‘]]);
        if (empty($admin)) {
            return ["status" => 1, "msg" => "没有此用户"];
        }
        if ($admin->password != md5($userArr["password"])) {
            return ["status" => 2, "msg" => "帐号或密码错误"];
        }
        //如果账号密码正确则写入权限

        $this->getRole($admin->role_id);
        Session::set("id", $admin->id);
        Session::set("account", $admin->account);
        return ["status" => 0, "route" => Url::build("index/index")];

    }

    /**
     * @param $role_id
     */
    public function getRole($role_id)
    {
        $role =Role::get($role_id);
        if(empty($role))
        {
            exit (json_encode(["status" => 2, "msg" => "当前用户没有任何权限,无法登录!"]));
        }

        $this->getNodeList($role->node_id);
    }

    /**
     * @param $node_list
     * @return string
     */
    public function getNodeList($node_list)
    {

        if ($node_list == "*") {
            Session::set("node", "*");
//            return [‘node‘=>‘*‘];
            //将权限表中前两级的当作菜单取出来
//            $nlist = Node::where(["parent_id" => 0])->field("id,name")->select();
//            $this->getMenu($nlist);
        } else {

            $where["id"] = ["in", $node_list];

            $plist = Node::where($where)->select();
            $plist_arr = collection($plist)->toArray();
            //session中生成菜单    //现在的问题是获取的数据中如何找出parent_id=0的。

            $this->getParents($plist_arr);
        }
    }

    /**
     * @param $nodeList
     */
    public function getParents($nodeList)
    {
        $parent = [];
        $pri = [];
        foreach ($nodeList as $pk => $pv) {
            if ($pv["parent_id"] == 0) {
                $parent[] = $pv;
            }
            if (strpos($pv["f_name"], ",")) {
                $pv_arr = explode(",", $pv["f_name"]);
                $pri[] =  url($pv["c_name"]."/".$pv_arr[0]);
                $pri[] =  url($pv["c_name"]."/".$pv_arr[1]);
                continue;
            }
            $pri[] =  url($pv["c_name"]."/".$pv["f_name"]);;
        }
        //session中生成权限
//        return $pri;
        Session("node",$pri);
    }
}
View Code

希望对大家有帮助,框架使用的是thinkphp5.0

 

以上是关于rbac 权限控制的主要内容,如果未能解决你的问题,请参考以下文章

layui 的权限树 authtree 用于类 RBAC 权限控制

RBAC从入门到精通

ThinkPHP中RBAC权限控制求助

RBAC权限控制项目

转:RBAC权限控制

如何在Java项目中做RBAC权限控制