laravel先後端分離的用戶登錄 退出 中間件的接口與session的使用

在項目開發的過程當中,須要有用戶的登錄 退出 還有校驗用戶是否登錄的中間件;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);
    }
}
相關文章
相關標籤/搜索