laravel 中的rbac自己简单的实现
用户表
CREATE TABLE `sys_user` (
`id` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '用户编号',
`ids` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增的id',
`login_name` varchar(100) COLLATE utf8_bin NOT NULL COMMENT '登录名',
`password` varchar(100) COLLATE utf8_bin NOT NULL COMMENT '密码',
`name` varchar(30) COLLATE utf8_bin DEFAULT NULL COMMENT '姓名',
`email` varchar(200) COLLATE utf8_bin NOT NULL COMMENT '邮箱',
`phone` varchar(20) COLLATE utf8_bin NOT NULL COMMENT '电话',
`mobile` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '手机',
`login_ip` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '最后登陆IP',
`login_date` datetime DEFAULT NULL COMMENT '最后登陆时间',
`login_flag` int(11) DEFAULT NULL COMMENT '是否可登录,1:可登陆,0:不可登陆',
`user_type` int(11) DEFAULT NULL COMMENT '用户类型',
`photo` varchar(1000) COLLATE utf8_bin DEFAULT NULL COMMENT '用户头像(暂定保存路径)',
`create_time` datetime DEFAULT NULL COMMENT '创建时间(申请时间)',
`update_time` datetime DEFAULT NULL COMMENT '更新时间(每次修改需要更新)',
`status` int(1) DEFAULT '2' COMMENT '状态,0:无效;1:有效;2:待审核',
`unit_price` double DEFAULT '0' COMMENT '用户单价(单位:元)',
`balance` double DEFAULT '0' COMMENT '用户余额(单位:元)',
`password_md5` char(100) COLLATE utf8_bin DEFAULT NULL COMMENT 'md5密码',
PRIMARY KEY (`ids`,`id`),
KEY `IDX_SYS_USER_LOGINNAME` (`login_name`),
KEY `IDX_SYS_USER_PHONE` (`phone`),
KEY `IDX_SYS_USER_MOBILE` (`mobile`),
KEY `IDX_SYS_USER_EMAIL` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
角色组
CREATE TABLE `sys_role` (
`id` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '角色ID',
`ids` int(11) NOT NULL AUTO_INCREMENT COMMENT 'role表中的自增id',
`name` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '角色名称',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remarks` varchar(500) COLLATE utf8_bin DEFAULT NULL COMMENT '角色说明',
PRIMARY KEY (`ids`,`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
用户角色组关系表
CREATE TABLE `sys_user_role` (
`user_id` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '用户ID',
`role_id` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '角色ID',
`user_ids` int(11) NOT NULL COMMENT 'user表中的自增id',
`role_ids` int(11) NOT NULL COMMENT 'role表中的自增id'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
权限表
CREATE TABLE `sys_menu` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
`parent_id` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '父级编号',
`id_path` varchar(2000) COLLATE utf8_bin DEFAULT NULL COMMENT '编号路径',
`name` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '功能菜单名称',
`name_path` varchar(2000) COLLATE utf8_bin DEFAULT NULL COMMENT '功能菜单路径',
`sort` decimal(10,0) DEFAULT NULL COMMENT '排序',
`href` varchar(2000) COLLATE utf8_bin DEFAULT NULL COMMENT '链接',
`icon` varchar(1000) COLLATE utf8_bin DEFAULT NULL COMMENT '图标路径',
`permission` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT 'shiro权限标识',
`is_show` int(1) DEFAULT NULL COMMENT '是否在菜单中显示,1:显示,0:不显示',
`remarks` varchar(2000) COLLATE utf8_bin DEFAULT NULL COMMENT '功能菜单描述',
`platform` tinyint(2) DEFAULT '0' COMMENT '平台 1 php后台',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=70012 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
权限角色关系表
CREATE TABLE `sys_role_menu` (
`role_id` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '角色ID',
`menu_id` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '菜单ID',
`role_ids` int(11) NOT NULL COMMENT 'role表中的自增id'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
验证当前用户的权限需要 先获取当前用户的信息(id) 然后去用户角色表中查找他对应的角色 然后再去角色权限表中查找出当前的用户的权限列表 看当前访问的路由是否在权限列表中 如果在就可以访问 如果不在就禁止访问
这些信息都需要保存到session中 然后验证的时候再取出来
login.php
<?php namespace iqiyi\Http\Controllers; use iqiyi\Models\SysRoleMenu;
use iqiyi\Models\SysUserRole;
use iqiyi\Models\SysRole;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
use iqiyi\Models\SysUser;
use Illuminate\Support\Facades\DB; class Login extends Controller
{ public function __construct() {
DB::connection()->enableQueryLog(); // 开启查询日志
} /**
* @param Request $request
* @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|void
*
*/
public function index(Request $request) { DB::connection()->enableQueryLog();
$username = $request->username;
$password = $request->password;
$errors = $request->errors; $password = md5($password.config('iqiyi.md5key','Iqiyi')); $users = SysUser::where(['login_name'=>$username,'password_md5'=>$password])->first();
//echo $users['id']; //dd($users);
$pri = [];
// if($users){
// // 角色
// $roleids = [];
// $role = SysUserRole::where('user_id',$users->id)->select('role_id')->where('role_id','<>','')->get();
// foreach ($role as $k=>$v){
// $roleids[] = $v['role_id'];
// }
// // 权限
// $menu = SysRoleMenu::whereIn('role_id',$roleids)->select('m.href')->leftjoin('sys_menu as m','sys_role_menu.menu_id','=','m.id')->get()->toArray();
//
// foreach ($menu as $k=>$v){
// $pri[] = $v['href'];
// }
//// print_r(DB::getQueryLog());
//// dd($users, $menu, $pri);
// } if($users){
// 角色
$roleids = [];
$role = SysUserRole::where('user_ids',$users->ids)->select('role_ids')->where('role_ids','<>','')->get();
foreach ($role as $k=>$v){
$roleids[] = $v['role_ids'];
}
// 权限
$menu = SysRoleMenu::whereIn('role_ids',$roleids)->select('m.href')->leftjoin('sys_menu as m','sys_role_menu.menu_id','=','m.id')->get()->toArray(); foreach ($menu as $k=>$v){
$pri[] = $v['href'];
}
// print_r(DB::getQueryLog());
// dd($users, $role, $roleids, $menu, $pri);
} // 权限判断
// if($pri && $users){
// Session::put('userid',$users['id']);
// Session::put('login_name',$users['login_name']);
// Session::put('pri',json_encode($pri));
// echo 1;
// $sessions = $request->session()->all();
// dump($sessions);
// die;
// return redirect('/');
// } if($pri && $users){
Session::put('userid',$users['ids']);
Session::put('login_name',$users['login_name']);
Session::put('pri',json_encode($pri));
// dump($users);
// echo 1;
// $sessions = $request->session()->all();
// dump($sessions);
// die;
return redirect('/');
} $error = '';
if($username && !$users){
$error = '用户名或密码错误';
}
if(!$pri && $users){
$error = '用户没有权限';
} return view('login')->with([
'error'=>$error,
'errors'=>$errors,
]); } /**
* @param Request $request
*/
public function logout(Request $request){
Session::forget('userid');
return redirect('/');
}
//$queries = \DB::getQueryLog(); // 获取查询日志 //dd($queries); // 即可查看执行的sql,传入的参数等等
}
middleware/authAdmin.php (中间件)
<?php namespace iqiyi\Http\Middleware; use Closure;
use Illuminate\Support\Facades\Session; class authAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next) {
$userid = Session::get('userid');
//dd(json_decode($pri,true));
$pri = Session::get('pri');
// dump($userid, $pri);
if (!$userid || !$pri) {
return redirect('/login');
} $url = $request->getRequestUri();
$postion = strpos($url, '?'); // 有?的标志
if ($postion) {
$url = substr($url, 0, strpos($url, '?')); // 把路径后面的?参数去掉
} $pri = json_decode($pri,true);
// dd($userid, $url, $postion, $pri); if ($url =='/') {
return $next($request);
}
if( !in_array($url,$pri)){
// echo 'error';
// return view('error');
return response()->view('error'); } if( !$userid){
return redirect('/login?errors=没有权限'); }
return $next($request);
}
}
给控制器配置中间件
routes/web.php
<?php /*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::group(['middleware' => ['\iqiyi\Http\Middleware\VerifyCsrfToken::class']], function () {
//支付订单
Route::any('order/{action}', function(\iqiyi\Http\Controllers\Order $index, $action,\Illuminate\Http\Request $request ){ return $index->$action($request);
})->middleware('authAdmin'); // 报告
Route::any('report/{action}', function(\iqiyi\Http\Controllers\Report $index, $action,\Illuminate\Http\Request $request ){ return $index->$action($request);
})->middleware('authAdmin'); // 数据统计
Route::any('statistics/{action}', function(\iqiyi\Http\Controllers\Statistics $index, $action,\Illuminate\Http\Request $request ){
return $index->$action($request);
})->middleware('authAdmin');
// 图片管理
Route::any('img/{action}', function(\iqiyi\Http\Controllers\Img $index, $action,\Illuminate\Http\Request $request ){ return $index->$action($request);
//dump($request);
})->middleware('authAdmin');
// 用户管理
Route::any('user/{action}', function(\iqiyi\Http\Controllers\User $index, $action,\Illuminate\Http\Request $request ){ return $index->$action($request);
})->middleware('authAdmin');
// 角色管理
Route::any('role/{action}', function(\iqiyi\Http\Controllers\Role $index, $action,\Illuminate\Http\Request $request ){ return $index->$action($request);
})->middleware('authAdmin');
// 菜单管理
Route::any('menu/{action}', function(\iqiyi\Http\Controllers\Menu $index, $action,\Illuminate\Http\Request $request ){ return $index->$action($request);
})->middleware('authAdmin'); Route::any('/login', 'Login@index');
Route::any('logout', 'Login@logout'); Route::any('/', 'Index@main')->middleware('authAdmin'); Route::any('import', 'Import@index')->middleware('authAdmin'); Route::any('import/{action}',function(\iqiyi\Http\Controllers\Import $index, $action,\Illuminate\Http\Request $request ){
return $index->$action($request);
})->middleware('authAdmin'); Route::any('stock/{action}',function(\iqiyi\Http\Controllers\Stock $index, $action,\Illuminate\Http\Request $request ){
return $index->$action($request);
})->middleware('authAdmin'); Route::get('downreport/{filename}/{expname}', function($filename,$expname) {
return response()->download(storage_path('report/'.$filename),$expname.'.xls');
})->middleware('authAdmin'); // Route::any('channel/{action}',function(\iqiyi\Http\Controllers\Channel $index, $action,\Illuminate\Http\Request $request ){
// return $index->$action($request);
// })->middleware('authAdmin');
Route::any('importlist', 'Import@lists')->middleware('authAdmin'); });
->middleware('xxx')
laravel 中的rbac自己简单的实现的更多相关文章
- laravel中redis数据库的简单使用
1.简介 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s . 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Set ...
- phpcms中的RBAC权限系统
PHPCMS中的RBAC权限系统主要用到了4张数据表:管理员表,角色表,菜单表,菜单权限表.先来看看数据库的数据表结构: admin 管理员表 ID 字段 类型 Null 默认 索引 额外 注释 1 ...
- laravel中的$request对象构造及请求生命周期
laravel应用程序中index.php是所有请求的入口.当用户提交一个form或者访问一个网页时,首先由kernel捕捉到该session PHP运行环境下的用户数据, 生成一个request对象 ...
- [Yii][RBAC]Yii中应用RBAC完全指南
开端筹办 Yii供给了强大的设备机制和很多现成的类库.在Yii中应用RBAC是很简单的,完全不须要再写RBAC代码.所以筹办工作就是,打开编辑器,跟我来. 设置参数.建树数据库 在设备数组中,增长以下 ...
- Laravel中的队列处理
Laravel中的队列处理 队列介绍 为什么要有消息队?这里先对其进行一个简单的介绍,方便还不了解的同学理解.在面向对象里,有一个很简单的概念--消息传递,而消息队列就可以在它上面扩展一下,把它说的更 ...
- 前后端分离Web项目中,RBAC实现的研究
在前后端分离Web项目中,RBAC实现的研究 最近手头公司的网站项目终于渐渐走出混沌,走上正轨,任务也轻松了一些,终于有时间整理和总结一下之前做的东西. 以往的项目一般使用模板引擎(如ejs)渲染 ...
- Laravel 中使用 Redis 数据库
一.前言 Redis 是一个开源高效的键值对存储系统,它通常用作为一个数据结构服务器来存储键值对,它可以支持字符串.散列.列表.集合.有序集合. 1. 安装 predis/predis 在 Larav ...
- laravel中实现短信发送验证码
前段时间想实现一个短信验证码的功能,但是卡了很长时间. 首先我用的是阿里云的短信服务业务,其首次接入流程如下: 在阿里云上开通短信服务后需要做的: 1,申请签名 2,申请模板 3,创建Acces ...
- Laravel 中缓存驱动的速度比较
缓存是web开发中重要的一部分,我相信很多人和我一样,经常忽略这个问题. 随着工作经验的累积,我已经意识到缓存是多么的重要,这里我通过 Scotch 来解释一下它的重要性. 通过观察发现,Scotch ...
随机推荐
- Construct Binary Tree from Inorder and Postorder Traversal(根据中序遍历和后序遍历构建二叉树)
根据中序和后续遍历构建二叉树. /** * Definition for a binary tree node. * public class TreeNode { * int val; * Tree ...
- iframe局部刷新的二种实现方法
需求描述: 当页面有一部分是不变的或整个页面的图片很多时,可以考虑使用局部刷新,以提高整体的下载速度与用户体验. 1,iframe实现局部刷新的方法一 复制代码代码示例: <script t ...
- Linux的chkconfig命令详解
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法: chkconfig [--a ...
- Day7 小练习(统计初始化数据的次数和对象之间的交互)
写一个小练习,定义好一个类,每初始化一次,计数器+1,统计最后次数. class OldboyStudent: school = 'oldboy' count= def __init__(self,n ...
- Oracle12c中数据泵新特性之功能增强(expdp, impdp)
Oracle的数据泵功能在10g中被引进.本文对数据泵在12c中的增强做一个概览. 1. 禁用日志选项(DISABLE_ARCHIVE_LOGGING) Impdp的TRANSFORM参数已经扩展 ...
- C# SqlBulkCopy数据批量入库
准备条件:20万+数据 界面设计使用的WPF. 没有对比就没有伤害,以下是我两种方式导入数据案例. 运行 结果对比: 首先使用一般sql语句导入,因为时间原因,我就没有等待程序执行完,但是我记录了大约 ...
- C# 使用SmtpClient发送Email
使用Winfrom写的报错信息发送邮件通知. 以下主要代码 /// <summary> /// 发送邮件核心代码 /// </summary> /// <param na ...
- SpringBoot Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.
使用SpringBoot写HelloWorld,当配置好启动类后,再创建新的controller或其它类,启动项目后访问对应的映射名,页面显示: Whitelabel Error Page This ...
- c# 语法要点速览
C# 变量类型 sbyte byte short ushort int uint long ulong float double decimal char bool string switch 默认不 ...
- 1 Numpy-科学计算
在Python中,使用list可以保存一组值,可以作为数组使用,但是比较浪费内存和时间.类似的array模块,不支持多维,也没有各种函数运算,因此也极其不方便. 为解决这一问题,Python提供了Nu ...