码迷,mamicode.com
首页 > 其他好文 > 详细

rbac 权限控制

时间:2017-09-20 17:53:19      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:控制   play   无法   生成   admin   mod   ram   response   sed   

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 权限控制

标签:控制   play   无法   生成   admin   mod   ram   response   sed   

原文地址:http://www.cnblogs.com/yilianjimao/p/7561966.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!