Laravel系列之CMS系统学习 — 角色、权限配置【2】

一、RBAC分析

基于角色的权限访问控制(Role-Based Access Control),这里存在这么几个玩意儿:角色、权限,用户

表:roles、permissions、role_has_permissions、model_has_roles、model_has_permissions(最后两张表可以看4.1有解释)

明确:用户属于什么角色,那么角色拥有什么权限,用户自然拥有

然后配置,就戳这里(后面就不添加了)~

二、角色的增删改查

这个就很普通的功能了,略???

但是有一些需要注意的地方:

1. 更新操作时,method使用PUT

2. Laravel的唯一性验证举例:‘title‘ => ‘required|unique:roles,title,‘.$id,

解释:对title字段进行验证——必填|唯一性验证:从拿一张表进行验证,验证什么字段,不验证当前字段(意思就是:比如你要修改的信息叫张三,表里面只有你当前编辑的这条记录是张三,所以忽略要这条记录,不然不就不唯一了嘛~)

3.Laravel再进行更新、删除操作时,需要进行传参(也就是你要删除那一条记录的唯一标识),而要想获取这个参数可以使用:$this->route(‘XXX‘)

三、权限(很重要,自学的过程中卡了好久)

控制权限的方式有很多种,但我个人认为,(也是组长要求哈哈哈哈)最合适的方式是中间件

1. 路由定义

1 // 权限管理
2 Route::get(‘role/permission/{role}‘, ‘[email protected]‘);//页面显示
3 Route::post(‘role/permission/{role}‘, ‘[email protected]‘);//提交表单

2. 页面展示

无论通过Modals还是页面来显示权限页面都可以,我觉得少的话使用Modals(注意使用Modals的话,就不用show方法了),多的话页面展示

然后就是遍历权限,有两种方法

方法一:遍历permission.php文件

方法二:通过方法来获取

1 public function permission(Role $role)
2 {
3     // 根据guard来获取权限
4     $modules = \HDModule::getPermissionByGuard(‘admin‘);
5
6     // 分配
7     // 之所以分配role是因为1.要进行checkbox选中判断,也就是判断当前用户是否有某权限  2.提交表单role_id
8     return view(‘admin::role.permission‘, compact(‘role‘), compact(‘modules‘));
9 }

然后就可以进行页面渲染了,@foreach就好啦~  里面的一大堆input只是样式啦~

 1 @extends(‘admin::layouts.master‘)
 2 @section(‘content‘)
 3     @component(‘components.tabs‘,[‘title‘=>$role->title.‘权限设置‘])
 4         @slot(‘nav‘)
 5             <li class="nav-item"><a href="/admin/role" class="nav-link">角色列表</a></li>
 6             <li class="nav-item"><a href="#" class="nav-link active">权限设置</a></li>
 7         @endslot
 8         @slot(‘body‘)
 9             <form action="/admin/role/permission/{{$role[‘id‘]}}" method="post">
10                 @csrf
11                 @foreach($modules as $module)
12                     <div class="card-body pb-0">
13                         @foreach($module[‘rules‘] as $rule)
14                             <div class="card card-flat">
15                                 <div class="card-header">{{$rule[‘group‘]}}</div>
16                                 <div class="col-12 col-sm-8 col-lg-6 form-check mt-2">
17                                     @foreach($rule[‘permissions‘] as $k=>$permission)
18                                         <p hidden>{{$i = $k + rand(0,1000000)}}</p>
19                                         <div class="checkboxWrapper theme3 extraSmallCheckboxSize mr-3"
20                                              style="float: left;">
21                                             <input type="checkbox" name="name[]" id="sample{{$i}}"
22                                                    {{$role->hasPermissionTo($permission[‘name‘])?‘checked=""‘:‘‘}} value="{{$permission[‘name‘]}}">
23                                             <label for="sample{{$i}}">
24                                                 <i>
25                                                     <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg"
26                                                          xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
27                                                          width="50px" height="50px" viewBox="0 0 50 50"
28                                                          enable-background="new 0 0 50 50" xml:space="preserve">
29                     <circle fill="none" stroke="#B7B7B7" stroke-width="3" stroke-miterlimit="10" cx="25.11" cy="24.883"
30                             r="23.519"/>
31                                                         <path fill="none" stroke-width="3" stroke-miterlimit="10" d="M48.659,25c0,12.998-10.537,23.534-23.534,23.534
32                     S1.591,37.998,1.591,25S12.127,1.466,25.125,1.466c9.291,0,17.325,5.384,21.151,13.203L19,36l-9-14"/>
33                 </svg>
34                                                 </i>
35                                                 <span style="float: right;margin-top: 3px;font-size: 14px;margin-left: 5px">{{$permission[‘title‘]}}</span>
36                                             </label>
37                                         </div>
38                                     @endforeach
39                                 </div>
40                             </div>
41                         @endforeach
42                     </div>
43                 @endforeach
44                 <button class="btn btn-primary">保存</button>
45             </form>
46         @endslot
47     @endcomponent
48 @endsection

permiss.blade.php

3. 给用户设置权限

1 public function permissionStore(Request $request, Role $role)
2 {
3     $role->syncPermissions($request->name); // 同步权限4     session()->flash(‘success‘, ‘修改权限成功‘);
5
6     return back();
7 }

4. 根据用户来控制后台侧边导航栏的显示

4.1 初始化管理员角色

4.1.1 分配角色 —— 角色属于那个模型

解释:因为CMS系统是多模块的,那么角色就得和不同模块绑定关系,不绑定就不可能操作该模块

$user->assignRole([‘super_user‘, ‘admin‘]);

注意:Laravel默认是没有这方法的,所以需要拓展模型(模拟多继承)

 1 <?php
 2
 3 namespace App;
 4
 5 use Illuminate\Notifications\Notifiable;
 6 use Illuminate\Foundation\Auth\User as Authenticatable;
 7 use Spatie\Permission\Traits\HasRoles;
 8
 9 class Admin extends Authenticatable
10 {
11     use Notifiable;
12     use HasRoles;
13 }

4.2 侧边导航栏显示

目的:给用户分配了什么权限,侧边导航栏就显示相应的权限链接

实现:

1. 再Config文件当中,将menus.php 和 permission.php 的 permission配置项进行统一

2. 修改_menus.blade.php文件

 1 <div class="left-sidebar-scroll">
 2     <div class="left-sidebar-content">
 3         <ul class="sidebar-elements">
 4             @foreach(\HDModule::getMenus() as $moduleName => $groups)
 5                 @foreach($groups as $group)
 6                     <li class="divider">{{$group[‘title‘]}}</li>
 7                     <li class="parent open">
 8                         <a href="#"><i class="{{$group[‘icon‘]}}"></i>&nbsp;<span>{{$group[‘title‘]}}</span></a>
 9                         <ul class="sub-menu">
10                             @foreach($group[‘menus‘] as $menu)
11                                 @can($menu[‘permission‘])
12                                     <li>
13                                         <a href="{{$menu[‘url‘]}}" pjax><i
14                                                     class="{{$menu[‘icon‘]}}"></i><span>&nbsp;{{$menu[‘title‘]}}</span></a>
15                                     </li>
16                                 @endcan
17                             @endforeach
18                         </ul>
19                     </li>
20                 @endforeach
21             @endforeach
22         </ul>
23     </div>
24 </div>

解释:@can是laravel的指令,用来检查用户是否具有某种权限

5. 站长权限(超级管理员权限)

5.1 对laravel-permission的致敬

我使用的laravel-module中是有对laravel-permission的一个改良,比如对中间件验证权限的改良(larave-permission处理不够灵活并对资源控制器支持不好)

laravel-module:

1. 在进行store和update的权限验证时,会自动对跳转到create、edit进行验证

2. 在进行站长权限判断时,一步即可(而laravel-permission需要先进行用户属于什么角色判断,再进行有什么权限判断两步)

5.2 修改Config/menus.php和Config/permission.php文件

之前在这两个文件中,对permission配置项进行了语义化的书(比如Admin模块下的角色管理中的permission配置项写的是Admin::config-roles),但其实这2个文件并不对用户开放,且一旦系统成型修改不大,所以运用了以下写法

 1 <?php return [
 2     0 =>
 3         [
 4             ‘title‘      => ‘系统管理‘,
 5             ‘icon‘       => ‘fa fa-navicon‘,
 6             ‘permission‘ => [‘Modules\Admin\Http\Controllers\[email protected]‘],
 7             ‘menus‘      =>
 8                 [
 9                     [
10                         ‘title‘      => ‘角色管理‘,
11                         ‘icon‘       => ‘fa fa-user-md‘,
12                         ‘permission‘ => ‘Modules\Admin\Http\Controllers\[email protected]‘,
13                         ‘url‘        => ‘/admin/role‘,
14                     ],
15                 ],
16         ],
17 ];

menus.php

 1 <?php
 2 /**
 3  * 权限配置
 4  * 为了避免其他模块有同名的权限,权限标识要以 ‘控制器@方法‘ 开始
 5  */
 6 return [
 7     [
 8         ‘group‘       => ‘角色管理‘,
 9         ‘permissions‘ => [
10             [
11                 ‘title‘ => ‘角色列表‘,
12                 ‘name‘  => ‘Modules\Admin\Http\Controllers\[email protected]‘,
13                 ‘guard‘ => ‘admin‘,
14             ],
15             [
16                 ‘title‘ => ‘添加角色‘,
17                 ‘name‘  => ‘Modules\Admin\Http\Controllers\[email protected]‘,
18                 ‘guard‘ => ‘admin‘,
19             ],
20             [
21                 ‘title‘ => ‘删除角色‘,
22                 ‘name‘  => ‘Modules\Admin\Http\Controllers\[email protected]‘,
23                 ‘guard‘ => ‘admin‘,
24             ],
25             [
26                 ‘title‘ => ‘修改角色‘,
27                 ‘name‘  => ‘Modules\Admin\Http\Controllers\[email protected]‘,
28                 ‘guard‘ => ‘admin‘,
29             ],
30             [
31                 ‘title‘ => ‘修改角色权限‘,
32                 ‘name‘  => ‘Modules\Admin\Http\Controllers\[email protected]‘,
33                 ‘guard‘ => ‘admin‘,
34             ],
35         ],
36     ],
37 ];

permission.php

修改之后,相应的_menus.blade.php也需要进行修改

 1 <div class="left-sidebar-scroll">
 2     <div class="left-sidebar-content">
 3         <ul class="sidebar-elements">
 4             @foreach(\HDModule::getMenus() as $moduleName => $groups)
 5                 @foreach($groups as $group)
 6                     <li class="divider">{{$group[‘title‘]}}</li>
 7                     <li class="parent">
 8                         @if(\HDModule::hadPermission($group[‘permission‘],‘admin‘))
 9                             <a href="#"><i class="{{$group[‘icon‘]}}"></i>&nbsp;<span>{{$group[‘title‘]}}</span></a>
10                             <ul class="sub-menu">
11                                 @foreach($group[‘menus‘] as $menu)
12                                     @if(\HDModule::hadPermission($menu[‘permission‘],‘admin‘))
13                                         <li>
14                                             <a href="{{$menu[‘url‘]}}" pjax><i
15                                                         class="{{$menu[‘icon‘]}}"></i><span>&nbsp;{{$menu[‘title‘]}}</span></a>
16                                         </li>
17                                     @endif
18                                 @endforeach
19                             </ul>
20                     </li>
21                     @endif
22                 @endforeach
23             @endforeach
24         </ul>
25     </div>
26 </div>

_menus.blade.php

5.3 站长权限配置

整个站都是属于他/她的,所以不需要对其进行验证

5.3.1 确定站长

运行 php artisan vender:publish --provider="Houdunwang\Module\LaravelServiceProvider"

在config/hd_module中就会有webmaster配置项啦

5.3.2 忽略检测站长权限

只需要将用户标识和webmaster配置项对应即可

5.3.3 添加中间件

在进行后台的任何操作时候,就需要进行中间件来判断是否该用户是站长

此时就需要路由

 1 <?php
 2
 3 Route::group(
 4     [‘middleware‘ => ‘web‘, ‘prefix‘ => ‘admin‘, ‘namespace‘ => ‘Modules\Admin\Http\Controllers‘],
 5     function () {
 6         Auth::routes();
 7     }
 8 );
 9
10 Route::group(
11     [‘middleware‘ => [‘web‘, ‘auth:admin‘], ‘prefix‘ => ‘admin‘, ‘namespace‘ => ‘Modules\Admin\Http\Controllers‘],
12     function () {
13         // 后台首页
14         Route::get(‘/‘, ‘[email protected]‘);
15
16         // 角色管理
17         Route::resource(‘role‘, ‘RoleController‘)->middleware(‘permission:superAdmin‘);
18
19         // 权限管理
20         Route::get(‘role/permission/{role}‘, ‘[email protected]‘)->middleware(‘permission:superAdmin‘);
21         Route::post(‘role/permission/{role}‘, ‘[email protected]‘)->middleware(‘permission:superAdmin‘);
22     }
23 );

注意:

1. 这个中间件是路由中间件,所以需要到app/Http/Kernel.php中进行注册(之后所以自定义的中间件都是如此,只是需要注册在相应位置即可)

2. middleware(‘permission:admin‘);中的admin参数是守卫者不是webmaster配置项

3.middleware(‘permission:admin,resource‘);中的resource参数时针对resource路由才添加

‘permission‘ => \Houdunwang\Module\Middlewares\PermissionMiddleware::class,

6. 零碎

6.1 修复Vue模板中不能使用JS的情况

需要使用@yield("")占位符,不然会报Vue模板错误

6.2 模型删除操作和表外键约束注意事项

站长可不敢删除啊

依赖表数据变化,本表数据删除

原文地址:https://www.cnblogs.com/ltqTest/p/10104843.html

时间: 2024-08-29 16:51:45

Laravel系列之CMS系统学习 — 角色、权限配置【2】的相关文章

Laravel系列之CMS系统学习 — 角色、权限配置【1】

一.后台Admin模块 后台管理是有管理员的,甚至超级管理员,所以在设计数据表的时候,就会有2个方案,一个方案是共用users数据表,添加is_admin,is_superAdmin字段来进行验证,或者将用户编到不同的组里面,另一个方案是,单独创建admins数据表来进行管理(这样前台和后台是两个事件,前台用户是没有机会操作后台相关功能的,也就是完全隔离了) 我采用第二种(实习快四个月了,跟了2个完整项目是这样~) 我在上一篇说到,我使用的是laravel-module,所以相关初始配置不再赘述

SSH系列:(16)角色-权限管理(后台)

1.角色和权限的关系 系统中可以存在多个角色,每个角色可以自由的组合系统定义的权限集合,即角色和权限的关系是多对多的关系.为了保存这种多对多关系,需要一个"角色权限表"来保存. 角色和权限的多对多关系,可以进行拆分:"角色"与"角色权限"的关系."权限"和"角色权限"的关系."角色"与"角色权限"的关系是一对多的关系:而"权限"与"角色权

SSH系列:(17)角色-权限管理(前台JSP)

1.listUI.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib uri="/struts-tags" prefix="s" %> <html> <head>     <%@include file="/common/header.jsp"%&

Laravel系列教程一:安装及环境配置

免费视频教程地址https://laravist.com/series/laravel-5-basic 最近在SF上面看到越来越多的Laravel相关的问题,而作为一个Laravel的脑残粉,本来打算有机会录视频教程放出来的,不过这个计划貌似由于某些原因必须得推迟一段时间,所以现在先把文章的系列教程写出来吧. 首先需要说明的是,这个教程对于完全没有上手Laravel的人来说,我尽量将一些概念和重点说清楚,不过你也不需要担心这需要花很多时间来跟着这个教程学习Laravel,我相信,如果你认认真真跟

Oracle基础学习5-- Oracle权限之”角色”

任何与权限相关的东西都少不了"角色"的概念,Java如此,.Net如此,Oracle当然也不例外. 角色其实就是权限的集合,将多个权限打包到一个角色中,这样每个角色有特定的权限.当需要给某个对象赋予某种权限时,就找到具有相应权限的角色,然后将它加到这个集合当中.下面就简单看看Oracle中角色的运用. 上篇文章讲到,为了给多用户授予各种权限,我们用到了"权限传递"来代替给用户们一个个授权,简化了授权过程.但这种方式较之用"角色"方式授权还是有很多

sharepoint 2016 学习系列篇(15)-自定义列表应用篇-(4)数据权限配置

当数据已经录入到列表中之后,接下来,朋友们可能会想知道,有些数据,只想给某些用户看到,或者编辑,列表是否支持这样的操作. 大微软的sharepoint平台,对于用户的需求,可以说是考虑得很周全的,权限管理,当然也是不可能漏掉的,而且权限管理,还是sharepoint上一个非常突出的亮点,数据安全性管理的颗粒度,很完善.接下来,我们来看下,如何在sharepoint的自定义列表中,给数据配置不同的用户访问权限,这些当然也是不需要开发,就能实现的. 前面讲到,用户访问sharepoint平台网站的时

设计OA系统的用户-角色-权限分配

转载:http://www.cnblogs.com/jsping/archive/2013/01/23/2872972.html 设计OA系统的用户-角色-权限分配 一,前言  本文主要讲述在OA系统设计时用户——角色——权限的数据库设计,以便实现权限分配. 二,初步分析 用户通过UI登录系统时,把用户的用户名.密码传递给后台判断用户表中是否存在可用的用户信息,如果存在那么允许页面的跳转,并设置一些Session信息,当页面跳转时根据用户的Session信息获取用户的角色,进一步根据角色获取用户

角色权限系统的 一些概念

用一个功能模块来举例子.一.建立角色功能并做分配:1.如果现在要做一个员工管理的模块(即Resources),这个模块有三个功能,分别是:增加,修改,删除.给这三个功能各自分配一个ID,这个ID叫做功能代号:Emp_addEmp,Emp_deleteEmp,Emp_updateEmp.2.建立一个角色(Role),把上面的功能代码加到这个角色拥有的权限中,并保存到数据库中.角色包括系统管理员,测试人员等.3.建立一个员工的账号,并把一种或几种角色赋给这个员工.比如说这个员工既可以是公司管理人员,

Java I/O系统学习系列二:输入和输出

编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象.“流”屏蔽了实际的I/O设备中处理数据的细节. 在这个系列的第一篇文章:<<Java I/O系统学习系列一:File和RandomAccessFile>>中,我们讲到RandomAccessFile可以写入和读取文件,具备I/O功能,但是其只能针对文件,而I/O还涉及到很多其他场景比如网络.读取内存中的字符串等,所以Java类库中提供了一系列的类库来对其进行支持,也就是