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 ...
随机推荐
- react中需要用到【深度复制】的问题
首先,说一下我所遇到的问题,我所做的项目是用的基于react的antd框架. 一张表格,里面的数据是从后台获取直接渲染,我点击修改按钮,在modal弹框中修改数据,但是没有点击确定,点击取消,发现页面 ...
- 修改input属性placeholder的样式
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 学习MQ(二)基本概念
学习MQ(二)基本概念 这次简单罗列一下MQ的基本概念,还有我对它们的理解 1.queue manager 队列管理器,这是MQ系统中最上层的一个概念.每一个queue manager都有一个侦听器, ...
- 微博评论箱的隐藏Bug解决
最近给站点添加社交评论功能,即用微博.QQ帐号就可以在网站上评论.其中Sina微博评论箱在IE和Firefox有个Bug,就是如果初始页面中微博评论箱所在那一部分处于不可见状态,那么后面即使切换了显示 ...
- Using SSH and SFTP in Mac OS X
http://answers.stat.ucla.edu/groups/answers/wiki/7a848/ SH and SFTP are command line applications av ...
- 一些Gym三星单刷的比赛总结
RDC 2013, Samara SAU ACM ICPC Quarterfinal Qualification Contest G 思路卡成智障呀! Round 1:对着这个魔法阵找了半天规律,效果 ...
- 架构之Nginx(负载均衡/反向代理)
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器 ,也是一个 IMAP/POP3/SMTP 代理 服务器 . Nginx 是由 Igor Sys ...
- Python 装饰器(Decorator)
装饰器的语法为 @dec_name ,置于函数定义之前.如: import atexit @atexit.register def goodbye(): print('Goodbye!') print ...
- Python_eval()
''' eval()用来把任意字符串转化为Python表达式并进行求值 ''' print(eval('3+4')) #计算表达式的值 a=3 b=4 print(eval('a+b')) #这时候要 ...
- redis的持久化之AOF
AOF Redis 分别提供了 RDB 和 AOF 两种持久化机制: RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中. AOF 则以协议文本的方式,将所有对数据库进行过写入的命令 ...