RBAC 基于角色的权限控制--打造通用web管理权限系统

文章目录

    • 1.权限的作用
    • 2.权限模型介绍
    • 3.RBAC架构
    • 4.RBAC模块功能
    • 5.实战案例
      • 5.1数据库设计
      • 5.2框架配置(略),使用tp5
      • 5.3bootstrap界面布局搭建
      • 5.4伪登录功能
      • 5.4角色管理

1.权限的作用

使用者角度

  • 权力 和 限制
  • 正确的行使权力
  • 在限制范围内使用权力

设计者角度

  • 安全:控制不同的角色合理的访问不同的资源

2.权限模型介绍

RBAC 基于角色的权限控制--打造通用web管理权限系统_第1张图片
ACL和RBAC对比
RBAC 基于角色的权限控制--打造通用web管理权限系统_第2张图片
RBAC优势

  • 简化了用户和权限的关系
  • 易扩展,易维护
    RBAC 基于角色的权限控制--打造通用web管理权限系统_第3张图片
    针对不同用户分配权限,ACL要操作多次,而RBAC只要针对角色分配就可以

3.RBAC架构

RBAC 基于角色的权限控制--打造通用web管理权限系统_第4张图片

4.RBAC模块功能

RBAC 基于角色的权限控制--打造通用web管理权限系统_第5张图片
RBAC 基于角色的权限控制--打造通用web管理权限系统_第6张图片

5.实战案例

5.1数据库设计

user表

字段名 类型 备注
id int(11)
name varchar(20) 用户名
email varchar(30) 用户邮箱
is_admin tinyint(1) 是否是管理员,1是管理员,默认值0
status tinyint(1) 状态,1表示有效,0表示无效
updated_time timestamp 更新时间
created_time timestamp 插入时间

role表

字段名 类型 备注
id int(11)
name varchar(50) 用户名
status tinyint(1) 状态,1表示有效,0表示无效
updated_time timestamp 更新时间
created_time timestamp 插入时间

user_role表

字段名 类型 备注
id int(11)
uid int(11) user_id
role_id int(11) role_id
created_time timestamp 插入时间

access表

字段名 类型 备注
id int(11)
title varchar(50) 权限标题
urls varchar(1000) 对应页面url
status tinyint(1) 状态,1表示有效,0表示无效
updated_time timestamp 更新时间
created_time timestamp 插入时间

role_access表

字段名 类型 备注
id int(11)
role_id int(11) role_id
access_id int(11) access_id
created_time timestamp 插入时间

app_access_log表(用户操作记录表)

5.2框架配置(略),使用tp5

5.3bootstrap界面布局搭建


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>RBACtitle>
    <link rel="stylesheet" href="__STATIC__/bootstrap/css/bootstrap.min.css">
    <link rel="stylesheet" href="__STATIC__/bootstrap/css/app.css">
    <script src="__STATIC__/bootstrap/js/bootstrap.min.js">script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.0/jquery.min.js">script>
head>
<body>

<nav class="navbar navbar-inverse navbar-fixed-top">
    <div class="container-fluid">
        
        <div class="navbar-header">
            <a class="navbar-brand" href="#">RBACa>
        div>

        
        <div class="collapse navbar-collapse">
            <ul class="nav navbar-nav">
                <li class="active"><a href="#">首页a>li>
            ul>
            <p class="navbar-text navbar-right">Hi,xxxp>
        div>
    div>
nav>

<div class="container-fluid">
    <div class="col-sm-2 col-md-2 col-lg-2 sidebar">
        <ul class="nav nav-sidebar">
            <li>权限演示页面li>
            <li><a href="javascript:void(0);">测试一a>li>
            <li><a href="javascript:void(0);">测试二a>li>
            <li><a href="javascript:void(0);">测试三a>li>
            <li><a href="javascript:void(0);">测试四a>li>
            <li><a href="javascript:void(0);">测试五a>li>
            <li>系统设置li>
            <li><a href="javascript:void(0);">用户管理a>li>
            <li><a href="javascript:void(0);">角色管理a>li>
            <li><a href="javascript:void(0);">权限管理a>li>
        ul>
    div>
    <div class="col-sm-10 col-sm-offset-2 col-md-10 col-md-offset-2 col-lg-10 col-lg-offset-2">
        <footer>
            <p class="pull-left">@baicaip>
            <p class="pull-right">Power By baicaip>
        footer>
    div>
div>


body>
html>

定义一个url统一管理类



namespace app\common\controller;

use think\Controller;

class UrlService extends Controller
{
    public static function buildUrl($uri, $params=[])
    {
        return url($uri,$params);
    }

    public static function buildNullUrl()
    {
        return "javascript:void(0);";
    }
}

5.4伪登录功能

没有真实的登录,在实际的开发过程中,肯定是要用户输入用户名和密码,然后通过提交表单来实现登录,这个课程中就没有这一个过程,只是通过get传递uid参数来实现假的登录
建立模型
RBAC 基于角色的权限控制--打造通用web管理权限系统_第7张图片
详细看github

//伪登录方法
    public function vLogin()
    {
        $uid = request()->get('uid', 0);
        if (!$uid) {
            return $this->redirect('/');
        }
        $userInfo = \app\index\model\User::get($uid);
        if (!$userInfo) {
            return $this->redirect('/');
        }
        //cookie保存登录态,cookie值加密 约定一个规则 userAuthToken + "#" + uid
        $this->createLoginStatus($userInfo);

        return $this->redirect('index/index');

    }
//验证登录是否有效,返回 true or  false
    protected function checkLoginStatus()
    {
        $authCookie = cookie($this->authCookieName);
        if (!$authCookie) {
            return false;
        }
        list($authCookie, $uid) = explode("#", $authCookie);

        if (!$authCookie || !$uid) {
            return false;
        }

        if ($uid && preg_match("/^\d+$/", $uid)) {
            $userInfo = \app\index\model\User::get($uid);
            if (!$userInfo) {
                return false;
            }
            //校验码
            if ($authCookie != $this->createAuthToken($userInfo['id'], $userInfo['name'], $userInfo['email'], $_SERVER['HTTP_USER_AGENT'])) {
                return false;
            }
            $this->currentUser = $userInfo;
            $this->assign('currentuser', $userInfo);
            return true;
        }
        return false;
    }

5.4角色管理

你可能感兴趣的:(RBAC 基于角色的权限控制--打造通用web管理权限系统)