在項目開發的過程當中,須要有用戶的登錄 退出 還有校驗用戶是否登錄的中間件;php
基本思路:前端
登錄:json
前端請求接口的參數校驗 用戶名 密碼規則的校驗 用戶名密碼是否正確的校驗;後端
若是上面的校驗都經過的了,把用戶的經常使用基本信息保存到session中;若是涉及到RBAC(權限校驗)也要把當前用戶全部的權限列表查出來而後也保存到session中session
退出:前後端分離
把保存的用戶信息session::forget()掉 刪除掉 調到登錄頁面便可post
中間件校驗:this
去判斷session中是否存在該用戶的信息便可 session::has('key');還有當前用戶請求的url是否在session中的列表中,若是沒有那麼拋給他們一個沒有權限的錯誤提示信息界面;url
目前先後端分離的項目中還沒加權限驗證這一塊,先上段未先後端分離的完整代碼吧:spa
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); } }