在项目开发的过程中,需要有用户的登陆 退出 还有校验用户是否登陆的中间件;

基本思路:

登陆:

前端请求接口的参数校验 用户名 密码规则的校验 用户名密码是否正确的校验;

如果上面的校验都通过的了,把用户的常用基本信息保存到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的使用的更多相关文章

  1. mock的使用及取消,node模仿本地请求:为了解决前后端分离,用户后台没写完接口的情况下

    借鉴:https://www.jianshu.com/p/dd23a6547114 1.说到这里还有一种是配置node模拟本地请求 (1)node模拟本地请求: 补充一下 [1]首先在根目录下建一个d ...

  2. laravel 前后端分离 token

    由于自己开发的项目中用到了 JWT 技术,前端采用了 Vue.js 框架,后端采用了 CodeIgniter 框架,故作此文帮助使用相同技术栈的朋友们. 具体思路如下:把后端生成的 JWT token ...

  3. SpringBoot+Shiro+JWT前后端分离实现用户权限和接口权限控制

    1. 引入需要的依赖 我使用的是原生jwt的依赖包,在maven仓库中有好多衍生的jwt依赖包,可自己在maven仓库中选择,实现大同小异. <dependency> <groupI ...

  4. 前后端分离+本地服务实时刷新+缓存管理+接口proxy+静态资源增量更新+各种性能优化+上线运维发布——gulp工作流搭建

    技巧集:http://www.gulpjs.com.cn/docs/recipes/ 其实无非就是利用各种gulp插件.node脚本对项目文件做各种IO操作,只是备忘,需要的话,还是自己重新写最合适. ...

  5. shiro,基于springboot,基于前后端分离,从登录认证到鉴权,从入门到放弃

    这个demo是基于springboot项目的. 名词介绍: ShiroShiro 主要分为 安全认证 和 接口授权 两个部分,其中的核心组件为 Subject. SecurityManager. Re ...

  6. 前后端分离djangorestframework—— 接入第三方的验证码平台

    关于验证码部分,在我这篇文章里说的挺详细的了:Python高级应用(3)—— 为你的项目添加验证码 这里还是再给一个前后端分离的实例,因为极验官网给的是用session作为验证的,而我们做前后端分离的 ...

  7. 前后端分离——token超时刷新策略

    前言 记录一下前后端分离下————token超时刷新策略! 需求场景 昨天发了一篇记录 前后端分离应用——用户信息传递 中介绍了token认证机制,跟几位群友讨论了下,有些同学有这么一个疑惑:toke ...

  8. 基于Vue的前后端分离项目实践

    一.为什么需要前后端分离 1.1什么是前后端分离  前后端分离这个词刚在毕业(15年)那会就听说过,但是直到17年前都没有接触过前后端分离的项目.怎么理解前后端分离?直观的感觉就是前后端分开去做,即功 ...

  9. 实战!spring Boot security+JWT 前后端分离架构认证登录!

    大家好,我是不才陈某~ 认证.授权是实战项目中必不可少的部分,而Spring Security则将作为首选安全组件,因此陈某新开了 <Spring Security 进阶> 这个专栏,写一 ...

随机推荐

  1. linux下fifo,mq,shm

    最近想为系统添加一个统计脚本,但是系统内的模块是有perl和java两种语言编写,且模块是通过crontab定时调用的,所以需要使用IPC传输信息. 第一个想到的是socket方式,感觉需要统一设定一 ...

  2. LeetCode第[10]题(Java):Regular Expression Matching

    题目:匹配正则表达式 题目难度:hard 题目内容:Implement regular expression matching with support for '.' and '*'. '.' Ma ...

  3. 开发常用js代码段

    // 获取http传递的参数export const getRequest = ()=>{ var url = location.search; //获取url中"?"符后的 ...

  4. 后台操作日志,插入数据获取的该数据主键ID为null

    代码如下: @Override public void saveTopicResource(TopicResourceModel model, Integer userId) { TopicResou ...

  5. 51nod 1270 dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1270 简单的线性dp,最近狂刷水题真的是...药丸 差值最大得话要么是峰 ...

  6. elasticsearch负载均衡节点——客户端节点 node.master: false node.data: false 其他配置和master 数据节点一样

    elasticSearch的配置文件中有2个参数:node.master和node.data.这两个参 数搭配使用时,能够帮助提供服务器性能. 数据节点node.master: false node. ...

  7. C++轮子队 敏捷冲刺

    团队Github地址:https://github.com/Pryriat/2048.git 敏捷开发——第1天 Alpha阶段第1次Scrum Meeting 敏捷开发起始时间 2018/10/27 ...

  8. Qt5学习笔记——QRadioButton与QbuttonGroup

    [我是小标题:使用QToolButton实现radio button功能.] QRadioButton是什么?  下图是Windows系统中典型的radio button显示效果.    QRadio ...

  9. C++函数模版实现

    若一个程序的功能是对某种特定的数据类型进行处理,则将所处理的数据类型说明为参数,那么就可以把这个程序改写成为模版,模版可以让程序对任何其他数据类型进行同样方式的处理. 本节主要是说一下C++的函数模版 ...

  10. 移动元素时,translate要比margin好

    比如 做全屏轮播时,父元素往往是被子元素撑起来的,那你设置父元素的margin时,往往会感染到子元素,如下图: 而用translate3d就不会出现这种效果: