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 }

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);
    }
}

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

时间: 2025-01-06 20:39:10

rbac 权限控制的相关文章

基于thinkphp的RBAC权限控制

RBAC  Role-Based Access Control 权限控制在后台管理中是十分常见的,它的模型大体上是下面这张图的形式 我用的字段和上面不一样,图只是个示例 一个简易的权限控制模型只需要3个表就行了 user表:记录用户的信息和用户的角色 ->user_id:用户的id ->user_role_id:用户的角色信息  0,1,2分别为超级管理员,经理,员工 ->其它省略... role表:记录不同的角色信息,和他们拥有的权限 ->role_id:角色的id    1为经

转:RBAC权限控制

名词解释: RBAC:Role-Based Access Control,基于角色的访问控制 关键词: RBAC,Java Shiro,Spring Security, 一. RBAC 要解决的常见问题 问题一:对某一个用户只授予一些特殊的权限 描述:既不希望扩大某一个角色的权限,也不希望因此创建出很多零碎的.只为一个用户而存在的角色. 问题二:性能问题 描述:B/S 下,菜单.页面.页面元素.dataset的列,这些层层权限判断过于复杂,容易造成系统访问非常缓慢. 问题三:如何减少 HardC

RBAC权限控制

名词解释: RBAC:Role-Based Access Control,基于角色的访问控制 关键词: RBAC,Java Shiro,Spring Security, 一. RBAC 要解决的常见问题 问题一: 对某一个用户只授予一些特殊的权限 描述:既不希望扩大某一个角色的权限,也不希望因此创建出很多零碎的.只为一个用户而存在的角色. 问题二: 性能问题 描述:B/S 下,菜单.页面.页面元素.dataset的列,这些层层权限判断过于复杂,容易造成系统访问非常缓慢. 问题三: 如何减少 Ha

yii2搭建完美后台并实现rbac权限控制案例教程

作者:白狼 出处:www.manks.top/article/yii2_frame_rbac_template 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 1.安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/config/main-local.php 实际项目中本地的数据库往往跟线上数据库不一致, 我们这里配置到mai

ThinkPHP中:RBAC权限控制的实习步骤

使用版本ThinkPHP3.1.3 第一步,建表及数据 第二步,建关联模型 第三步,控制器使用关联模型.配置文件 第四步,模板显示数据 第一步,建表及数据 在数据库中,建立一个companysvn数据库,库下建立五张表 建表好导入数据的代码如下 1 # -------------------------------------------------------- 2 # Host: 127.0.0.1 3 # Server version: 5.0.45-community-nt-log 4

使用Spring Security、Spring Data Jpa实现的RBAC权限控制

正好这几天不是那么忙,所以就研究了一下Spring Security的使用,为了以后方便写篇帖子记录一下. 1.什么是Spring Security? 我想关于什么是Spring Security我都不需要在这里赘述,大家可以到网上百度一下,但是问了大家能快速的融入还是贴一下 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转I

rbac权限控制,基于无线分类

2018年9月18日11:21:28 数据库结构 CREATE TABLE `admin` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `create_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新时

yii2 rbac权限控制之菜单menu详细教程

%E5%90%91%E9%87%8F%E8%87%AA%E5%9B%9E%E5%BD%92%E6%A8%A1%E5%9E%8BVS%E9%A3%8E%E9%99%A9%E4%BB%B7%E5%80%BC%E6%A8%A1%E5%9E%8BVAR%26VaR http://auto.315che.com/x5m/qa23893599-2.htm ????aXAoUXbKE?W??Ё???? http://auto.315che.com/rongwei550/qa23847097.htm ????P

ThinkPHP操作名权限控制

其实ThinkPHP已经内置了RBAC权限控制,操作也很方便,不过总是感觉平常的小站没有必要用RBAC.有的时候需求很简单,权限控制只检测到操作名上,不细分到方法名上.这样做完全没有必要用RBAC.好处:1.节省时间(有的时候老板定的交工时间是死的)2.懒人你懂的 权限的逻辑很简单,后台给每个用户添加一个字段,暂且命名为Competenct,  然后写一个给用户赋权限的多选框,类似于 每个多选框的值就是当前多选框的操作名,比如你有一个ArticleAction.class.php.那么你的val