基于角色的权限管理拓展包
本拓展包是基于Laravel Permission的界面化封装,用于快速搭建权限管理后台
本拓展包运行基础环境:
- Php >= 7.2
- Laravel Version >= 6.1 && < 7.0 (Laravel大于7版本暂不支持,会尽快跟进)
本文中的 权限 也就是 laravel中的 路由
造轮子造的很烦,但又找不到完全合适的轮子去用,所以只能自己造了。
Laravel Permission 项目很好用,但是不提供UI。本项目是基于Laravel Permission,在此基础上,加上了UI,努力做到开箱即用。
本拓展包做到的功能:
- 基于角色的权限管理,一个用户可以分配多个角色,一个角色可以分配多个权限
- 基于当前用户所拥有的权限,动态生成菜单
- 一键更新最新权限
- 记录用户操作日志,可使用队列异步
- 后台界面
- Google Authenticator
推荐使用在Laravel新项目 记得先在php.ini中取消对
exec
,shell_exec
,proc*
等方法的限制
修改配置文件.env
# change database, and key
# change cache
CACHE_DRIVER=redis
REDIS_CLIENT=predis
# suggest
QUEUE_CONNECTION=redis
# google authenticator
GOOGLE_AUTHENTICATOR=false
在项目根目录运行 composer
$ composer require ohhink/rrm
根目录下运行资源发布,此命令会增加配置文件(admin.php
,filesystems.php
,permission.php
),以及前端资源文件和数据库填充文件
$ php artisan vendor:publish
# 如果要获取最新的Seeder数据,运行如下命令强制覆盖. 此命令会覆盖掉原先的文件,请谨慎操作
$ php artisan vendor:publish --tag=seeds --force
根目录下运行数据库迁移填充命令
# run autoload first to update the userseeder
$ composer dump-autoload
$ php artisan migrate:refresh --seed
$ php artisan db:seed --class=RrmDatabaseSeeder
设置文件夹权限和软连接
$ chmod -R 777 storage
$ php artisan storage:link
如要开启Google Authenticator功能,需手动加入服务提供者
// config/app.php
'providers' => [
//........
Earnp\GoogleAuthenticator\GoogleAuthenticatorServiceprovider::class,
SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class,
],
'aliases' => [
//..........
'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class
],
至此,安装完毕
-
后台默认路径
/admin
, 此路径可以在admin.php
中配置 安装过程中,已经默认创建了一个超级管理员admin
账号 : [email protected] 密码 : admin&%@cv..
-
RBAC 的理念是,将权限赋予给角色,将角色赋予给用户。一个角色可以有多个权限,一个用户可以有多个角色。 所以使用以下步骤加入你的业务逻辑
- 编写好你的业务逻辑路由
- 通过路由检测功能,获取最新的权限,例如test
- 在 resources/vendor/rrm/zh-cn/permission.php 中创建对应的翻译数据,若无此文件,可以自行创建此路径下的 permission.php。例如将 test 翻译为 测试功能
- 给对应的角色分配该路由,例如给admin用户分配测试功能
- 如果此功能为菜单功能,需要新增菜单,并重新调整菜单布局
-
如果你想重写路由,请将以下代码加入文件route/web.php
# this is rewrite the route to your app/Http/Controllers/IndexController.php index() Route::prefix(config('admin.prefix'))->middleware([ 'auth', 'admin' ])->name('admin.')->group(function () { Route::get('/', 'IndexController@index')->name('index'); });
在你的 app/Http/Controllers/IndexController.php 控制器中,你应该这样写
public function index() { // put your code here !!! // recover the view in /resources/views/vendor/rrm/admin/index.blade.php // OR you can just run command below, it will create blade files automatically // php artisan vendor:publish --tag=views --force return view('rrm::admin.index'); }
-
为了使用右侧菜单上的在线用户功能,你需要在文件app/Console.Kernel.php中增加命令,如下
protected function schedule(Schedule $schedule) { // $schedule->command('inspire') // ->hourly(); $schedule->command('admin-tool:cache-online-users')->everyMinute(); }
同时,需要在服务器定时任务中,加入如下配置
* * * * * php /home/vagrant/blade_package/artisan schedule:run >> /dev/null 2>&1
-
因为本项目自带日志记录,用户的每一步操作都会记录下来。为了避免响应过慢的问题,可以开启异步记录,提升响应速度。 想要修改为异步,只需要将
.env
文件中的QUEUE_CONNECTION=sync
修改为QUEUE_CONNECTION=redis
当然,要使用redis,前提是已经加入PRedis包或者Redis服务 -
如果你想修改无权限报错页面(500),你可以创建 resource/views/vendor/rrm/500.blade.php 文件来重写它
-
监听队列命令
php artisan queue:work --queue=logs --sleep=3 --tries=3 # 建议使用supervisor # supervisor配置文件 laravel-worker.conf [program:logs] process_name=%(program_name)s_%(process_num)02d command=php path_to/artisan queue:work --queue=logs --sleep=3 --tries=3 autostart=true autorestart=true user=root numprocs=2 redirect_stderr=true stdout_logfile=path_to/supervisor/logs.log 保存之后,运行 supervisorctl reload 加载配置
-
本项目后台模板,可以直接引用,只需在其中编写自己的业务逻辑页面
@extends('rrm::admin.layout') @section('content') <section id="main-content"> <section class="wrapper"> @if (Session::has('success')) @include('rrm::admin.layout.success',['msg'=>Session::get('success')]) @endif @if (Session::has('error')) @include('rrm::admin.layout.error',['msg'=>Session::get('error')]) @endif <div class="row"> <div class="col-lg-12"> </div> </div> </section> </section> @endsection @section('js') @endsection @section('css') @endsection
-
使用Google Authenticator
# 首先,在env中加入配置 GOOGLE_AUTHENTICATOR=true # 当上述配置打开后,后台管理员访问任意页面均会跳转至Google Authenticator绑定页面,绑定后,才可进行下一步操作 # 当程序中需要验证google验证码时,可以使用如下伪代码 public function index() { // $google 用户之前绑定的code // $vertify 本次待验证的验证码 if (\OhhInk\Rrm\Model\Google::CheckCode($google, $vertify)) { // pass } else { // fail } }
- Laravel Permission - Associate users with permissions and roles
非常欢迎你的加入! 有任何问题或者想要贡献代码,请提交 issue
MIT © OhhInk