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 ...
随机推荐
- 服务端搭建——腾讯云通信(IM)
前言 在手机app中因为需要即时聊天功能,在项目采用腾讯云通信服务.如下流程图: 当手机端拿到签名后,就可登录IM,使用im提供的sdk收发信息. 准备工作 1.在腾讯云注册获取appid 2.申请开 ...
- Srping mvc mabatis 报错 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
我的Mapper采用接口+注解的方式注入 @Repository(value="customerServOutCallMapper")public interface Custom ...
- AI 学习之路
前言:本文章纯属自己学习路线纪录,不喜勿喷. 最近AI很火,几乎是个程序员 都要去学习AI,作为一个菜鸡小前端,我也踏上了学习AI的方向. 在学习之中,最开始遇到了很多的困难,比如你不知道如何切入进来 ...
- Go语言开发区块链只需180行代码
区块链开发用什么语言?通过本文你将使用Go语言开发自己的区块链(或者说用go语言搭建区块链).理解哈希函数是如何保持区块链的完整性.掌握如何用Go语言编程创造并添加新的块.实现多个节点通过竞争生成块. ...
- 利用arcserver 自带tomcat实现上传shapefile、cad等文件,然后用soe解析。
一.功能实现分析 1.soe中传入指定路径目录和文件名就能读取shp.cad并解析,然后返回JSON格式数据给flex端生成图形.(soe读取的是本地绝对路径) 2.所以首先要上传文件到soe发布所在 ...
- bootstrap-table+x-editable入门
Bootstrap-table 快速入门bootstrap-table----我的表单不可能这么帅. Table of contents Quick start Why use it What's i ...
- Java单例模式(Singleton)以及实现
一. 什么是单例模式 因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 二. 单例模式的特点 1. 单例模式只能有一个实例. 2. 单例类必须创建 ...
- Spring Boot 发送邮件
需求 最近因为业务的变更,需要对老用户进行发送邮件处理.目前市面上也有很多代发邮件的接口,可以接入.由于量不是特别大,放弃了这个途径.改用我们自己通过 smtp 发送邮件来处理. 技术选择 Java ...
- Python_回调函数
import os import stat def remove_readonly(func,path): #定义回调函数 os.chmod(path,stat.S_IWRITE) #删除文件的只读文 ...
- Maven学习(七)-- 使用Maven构建多模块项目
摘自:http://www.cnblogs.com/xdp-gacl/p/4242221.html 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为doma ...