laravel前后端分离的用户登陆 退出 中间件的接口与session的使用
在项目开发的过程中,需要有用户的登陆 退出 还有校验用户是否登陆的中间件;
基本思路:
登陆:
前端请求接口的参数校验 用户名 密码规则的校验 用户名密码是否正确的校验;
如果上面的校验都通过的了,把用户的常用基本信息保存到session中;如果涉及到RBAC(权限校验)也要把当前用户所有的权限列表查出来然后也保存到session中
退出:
把保存的用户信息session::forget()掉 删除掉 调到登陆页面即可
中间件校验:
去判断session中是否存在该用户的信息即可 session::has('key');还有当前用户请求的url是否在session中的列表中,如果没有那么抛给他们一个没有权限的错误提示信息界面;
目前前后端分离的项目中还没加权限验证这一块,先上段未前后端分离的完整代码吧:
login.php
<?php namespace ai\Http\Controllers; use ai\Models\SysRoleMenu;
use ai\Models\SysUserRole;
use ai\Models\SysRole;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
use ai\Models\SysUser;
use Illuminate\Support\Facades\DB;
use ai\Lib\Http as Htpd; 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) { $username = $request->username;
$password = $request->password;
$errors = $request->errors;
//echo md5("123456ai");
$password = md5($password.'ai'); $users = SysUser::where(['login_name'=>$username,'password'=>$password])->first();
//echo $users['id']; $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){
// 角色
$roleid = [];
$role = SysUserRole::where('user_id',$users->id)->select('role_id')->where('role_id','<>','')->get();
//dump($role);
foreach ($role as $k=>$v){
$roleid[] = $v['role_id'];
}
// 权限
$menu = SysRoleMenu::whereIn('role_id',$roleid)->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('name',$users['name']);
Session::put('pri',json_encode($pri));
// echo 1;
// die;
return redirect('/');
} $error = '';
if($username && !$users){
$error = '用户名或密码错误';
}
// dump($pri);
//dump($users);
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('/');
} /**
* 修改密码
*/
public function modifyPwd(Request $request)
{
$old_pwd = $request->old_pwd;
$new_pwd = $request->new_pwd;
$confirm_pwd = $request->confirm_pwd;
$message = '';
if($new_pwd != $confirm_pwd) {
$message = '两次密码不相同';
}
$username = Session::get('login_name');
$password = md5($old_pwd.'ai');
$new_password = md5($new_pwd.'ai');
$users = SysUser::where(['login_name'=>$username,'password'=>$password])->first();
if($new_pwd && !$users){
$message = '密码错误';
}
if($username && $users) {
$res = SysUser::where('login_name', $username)->update(['password' => $new_password]);
if ($res) {
return redirect('/');
}
}
return view('modifyPwd')
->with('message', $message)
;
} }
authAdmin.php 中间件
<?php namespace ai\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');
$userid = Session::get('userid');
dd($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, '?')); // 把路径后面的?参数去掉
}
// /downreport/1524470328.xls/数据分析类
if (strpos($url, 'downreport') !== false) {
$url = '/downreport';
}
// dd($url);
$pri = json_decode($pri,true);
// dd($userid, $url, $postion, $pri); if ($url =='/') {
return $next($request);
}
if( !in_array($url,$pri)){ // 显示没有操作权限的页面
return response()->view('error'); } if( !$userid){
return redirect('/login?errors=没有权限'); }
return $next($request);
}
}
laravel前后端分离的用户登陆 退出 中间件的接口与session的使用的更多相关文章
- mock的使用及取消,node模仿本地请求:为了解决前后端分离,用户后台没写完接口的情况下
借鉴:https://www.jianshu.com/p/dd23a6547114 1.说到这里还有一种是配置node模拟本地请求 (1)node模拟本地请求: 补充一下 [1]首先在根目录下建一个d ...
- laravel 前后端分离 token
由于自己开发的项目中用到了 JWT 技术,前端采用了 Vue.js 框架,后端采用了 CodeIgniter 框架,故作此文帮助使用相同技术栈的朋友们. 具体思路如下:把后端生成的 JWT token ...
- SpringBoot+Shiro+JWT前后端分离实现用户权限和接口权限控制
1. 引入需要的依赖 我使用的是原生jwt的依赖包,在maven仓库中有好多衍生的jwt依赖包,可自己在maven仓库中选择,实现大同小异. <dependency> <groupI ...
- 前后端分离+本地服务实时刷新+缓存管理+接口proxy+静态资源增量更新+各种性能优化+上线运维发布——gulp工作流搭建
技巧集:http://www.gulpjs.com.cn/docs/recipes/ 其实无非就是利用各种gulp插件.node脚本对项目文件做各种IO操作,只是备忘,需要的话,还是自己重新写最合适. ...
- shiro,基于springboot,基于前后端分离,从登录认证到鉴权,从入门到放弃
这个demo是基于springboot项目的. 名词介绍: ShiroShiro 主要分为 安全认证 和 接口授权 两个部分,其中的核心组件为 Subject. SecurityManager. Re ...
- 前后端分离djangorestframework—— 接入第三方的验证码平台
关于验证码部分,在我这篇文章里说的挺详细的了:Python高级应用(3)—— 为你的项目添加验证码 这里还是再给一个前后端分离的实例,因为极验官网给的是用session作为验证的,而我们做前后端分离的 ...
- 前后端分离——token超时刷新策略
前言 记录一下前后端分离下————token超时刷新策略! 需求场景 昨天发了一篇记录 前后端分离应用——用户信息传递 中介绍了token认证机制,跟几位群友讨论了下,有些同学有这么一个疑惑:toke ...
- 基于Vue的前后端分离项目实践
一.为什么需要前后端分离 1.1什么是前后端分离 前后端分离这个词刚在毕业(15年)那会就听说过,但是直到17年前都没有接触过前后端分离的项目.怎么理解前后端分离?直观的感觉就是前后端分开去做,即功 ...
- 实战!spring Boot security+JWT 前后端分离架构认证登录!
大家好,我是不才陈某~ 认证.授权是实战项目中必不可少的部分,而Spring Security则将作为首选安全组件,因此陈某新开了 <Spring Security 进阶> 这个专栏,写一 ...
随机推荐
- Java条件语句之 if...else
if...else 语句的操作比 if 语句多了一步: 当条件成立时,则执行 if 部分的代码块: 条件不成立时,则进入 else 部分.例如,如果考试成绩大于 90 分,则奖励一个 IPHONE ...
- java sleep()和wait()的区别
java sleep()和wait()的区别? sleep()和wait()都能阻塞当前线程. 区别1: sleep()属于Thread类:wait()属于Object类. 区别2: 调用sleep( ...
- Kubernetes源码之旅:从kubectl到API Server
概述: Kubernetes项目目前依然延续着之前爆炸式的扩张.急需能够理解Kubernetes原理并且贡献代码的软件开发者.学习Kubernetes源码并不容易.Kubernetes是使用相对年轻的 ...
- LeetCode第[48]题(Java):Rotate Image
题目:矩阵旋转 难度:Medium 题目内容: You are given an n x n 2D matrix representing an image. Rotate the image by ...
- BZOJ 3698 XWW的难题:有上下界的最大流
传送门 题意 给你一个 $ n*n $ 的正实数矩阵 $ A $ ,满足XWW性. 称一个 $ n*n $ 的矩阵满足XWW性当且仅当: $ A[n][n] = 0 $ 矩阵中每行的最后一个元素等于该 ...
- DOCKER实战案例
操作系统:[root@yz6205 ~]# docker search busyboxNAME DESCRIPTION STARS OFFICIAL AUTOMATEDbusybox Busybox ...
- Android开发调试中遇到的Waiting for HOME解决方案
显示问题如图: 基本解决思路:在AVD里面单独启动运行一次模拟器,然后尝试运行程序,基本会解决这个问题.
- 让Android模拟器飞一会
https://software.intel.com/zh-cn/android/articles/speeding-up-the-android-emulator-on-intel-architec ...
- python django框架(一)
s4day63内容回顾: 1. 安装 2. 创建用户 + 授权 3. 连接 - 数据库 终端创建数据库(字符编码) - 数据表 终端 ORM pymysql create ...)engine=inn ...
- 【Codeforces】894D. Ralph And His Tour in Binary Country 思维+二分
题意 给定一棵$n$个节点完全二叉树,$m$次询问,每次询问从$a$节点到其它所有节点(包括自身)的距离$L$与给定$H_a$之差$H_a-L$大于$0$的值之和 对整棵树从叶子节点到父节点从上往下预 ...