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

基本思路:

登陆:

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

如果上面的校验都通过的了,把用户的常用基本信息保存到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. nagios报错Error: No such CGI app - /usr/local/nagios/sbin/nagios/cgi-bin/status.cgi may not exist or is not executable by this process.

    加上rewrite rewrite ^/nagios/cgi-bin/(.*)\.cgi /$.cgi break;  

  2. NumPy数学算数函数

    NumPy - 算数函数 很容易理解的是,NumPy 包含大量的各种数学运算功能. NumPy 提供标准的三角函数,算术运算的函数,复数处理函数等. 三角函数 NumPy 拥有标准的三角函数,它为弧度 ...

  3. scala学习手记26 - 重用函数值

    函数值对消除代码重复有很大的帮助.但是像函数值这样直接将一个函数作为另一个函数的参数却不太利于函数值本身的重用. 来看一个例子: class Equipment(val routine: Int =& ...

  4. Hash算法-CityHash算法

    cityhash系列字符串散列算法是由著名的搜索引擎公司Google 发布的 (http://www.cityhash.org.uk/). Google发布的有两种算法:cityhash64 与 ci ...

  5. IOS-通讯录

    一.通讯录简介 iOS提供了AddressBook.framework框架,允许开发者与设备中的通讯录进行数据交互   二.查询授权状态 可以调用ABAddressBookGetAuthorizati ...

  6. 28-THREE.JS 扇形圆形

    <!DOCTYPE html> <html> <head> <title></title> <script src="htt ...

  7. 详解 WebAPI 签名机制

    首先,写这篇文章的原因是因为最近某一个项目中的接口被人为调用了,导致了数据库数据被串改.虽然是内部人无意点的,但还是引起了我的担忧,所有整理了下关于WebAPI的相关签名机制. 一.我们在开发接口时, ...

  8. 【转载】Git,Github和Gitlab简介和基本使用Gitlab安装和使用

    http://blog.csdn.net/u011241606/article/details/51471367

  9. LeetCode OJ:Plus One (加1)

    Given a non-negative number represented as an array of digits, plus one to the number. The digits ar ...

  10. Delphi XE4 Upate1 更新升级记录.

    一直没时间,这两天折腾了一下 升级了.  其实也可能修了老bug 引入新bug. 呵呵. 看看Emb 都修了什么吧.  我干脆是重新安装的. 虽然官方也有一个单独的update.exe.  从这些bu ...