1. 程式人生 > >TP5.1使用者登入成功處理儲存使用者資訊Session優化

TP5.1使用者登入成功處理儲存使用者資訊Session優化

author:咔咔

wechat:fangkangfk

在使用者登入成功後,我們會將使用者的資訊儲存到session中

步驟:

我們在使用者登入後會儲存很多的使用者資訊,也會設定很多的session的key,後期專案不方便維護和管理

這就需要建立一個工具類來管理我們的SESSION儲存使用者資訊(app\util\SC),將我們需要處理的所有的儲存操作放置裡邊

在下來就是建立門面類(facade\SC)代理這個工具類,在這一步我們需要建立config\facade。放置facade的配置

下來就需要建立鉤子初始化

原始碼:

<?php

namespace app\service;

use app\model\user\User;
use Session;

class UserService
{
    // 定義多種登入方式
    private $loginWay = [
        // 使用者名稱
        'user_name',
        // 郵箱
        'user_emal',
        // 電話
        'user_tel'
    ];

    public function login($username,$password)
    {   
        // 使用迴圈方式判斷使用者名稱是否存在
        foreach($this->loginWay as $k=>$v){
            $user = User::where([$v=>$username])->find();
            // 如果存在就有這個使用者,跳出
            if($user){
                break;
            }
        }

        if(!$user){
            //使用者名稱不存在
           return ERROR_NO_USER;
        }
        if($user->user_status != 1){
            // 使用者是否被封
            return ERROR_USER_START;
        }
        if(!password_verify($password,$user->user_password)){
            // 密碼錯誤,登入失敗
            return ERROR_PASSWORD;
        }

        // 使用者登入成功後操作儲存使用者資訊
        $data = [
            'uid' => $user->uid,
            'user_name'=>$user->user_name,
            'is_system'=>$user->is_system,
            'nick_name'=>$user_name,
            'role_id'=>$user->role_id
        ];
        
        Session::set('USER_INFO_SESSION',$data);

        //登入成功
        return SUCCESS;
    }
}

很明顯為了保障方法的單一原則,我們需要對使用者登入後的儲存信心資料進行分離

我們就可以建立一個方法來專門處理儲存使用者資訊的操作

原始碼:

<?php

namespace app\service;

use app\model\user\User;
use Session;

class UserService
{
    // 定義多種登入方式
    private $loginWay = [
        // 使用者名稱
        'user_name',
        // 郵箱
        'user_emal',
        // 電話
        'user_tel'
    ];

    public function login($username,$password)
    {   
        // 使用迴圈方式判斷使用者名稱是否存在
        foreach($this->loginWay as $k=>$v){
            $user = User::where([$v=>$username])->find();
            // 如果存在就有這個使用者,跳出
            if($user){
                break;
            }
        }

        if(!$user){
            //使用者名稱不存在
           return ERROR_NO_USER;
        }
        if($user->user_status != 1){
            // 使用者是否被封
            return ERROR_USER_START;
        }
        if(!password_verify($password,$user->user_password)){
            // 密碼錯誤,登入失敗
            return ERROR_PASSWORD;
        }

        // 使用者登入後的操作
        $this->initLogin($user);

        //登入成功
        return SUCCESS;
    }


    // 登入初始化
    public function initLogin()
    {

        // 使用者登入成功後操作儲存使用者資訊
        $data = [
            'uid' => $user->uid,
            'user_name'=>$user->user_name,
            'is_system'=>$user->is_system,
            'nick_name'=>$user_name,
            'role_id'=>$user->role_id
        ];
        // 儲存使用者資訊
        Session::set('USER_INFO_SESSION',$data);
        // 儲存使用者角色
        Session::set('USER_ROLE_SESSION',$user->role_id);
        // 儲存是否是系統後臺的使用者
        Session::set('USER_IS_SYSTEM',$user->is_system);

    }

}

我們就會發現需要儲存的資訊是比較多的,這裡只是做了儲存使用者資訊,使用者退出後我們還是需要在寫一遍,這是不合適的

所以我們就建立一個工具類SC

原始碼: 

<?php

namespace app\util;

use Session;
/**
 * 工具類
 * 使用者快取 facade代理 SC
 */
class SC
{
      /**
       * 使用者登入的session key
       */
      CONST LOGIN_MARK_SESSION_KEY = 'LOGIN_MARK_SESSION';
      /**
       * 許可權資訊
       * @var string
       */
      CONST USER_ROLE_SESSION = 'USER_ROLE_SESSION';
      /**
       * USER使用者資訊
       * @var string
       */
      CONST USER_INFO_SESSION = 'USER_INFO_SESSION';
      // /**
      //  * 是否設定使用者登入的有效時間
      //  * @var string
      //  */
      // CONST CHECK_TIME_SESSION = 'CHECK_TIME_SESSION';
      //
      // private $checkTime = false;

      //---------------------------設定和判斷使用者的是否登入
      // 設定使用者登入token
      public function setLogin($value)
      {
          Session::set(self::LOGIN_MARK_SESSION_KEY, password_hash($value, 1));
      }
      // 判斷使用者是否登入成功
      public function getLogin()
      {
          Session::get(self::LOGIN_MARK_SESSION_KEY);
      }
      //---------------------------設定使用者和獲取使用者的登入資訊
      // 設定使用者的資訊
      public function setUserInfo($value)
      {
          Session::set(self::USER_INFO_SESSION, $value);
      }
      // 獲取使用者的資訊
      public function getUserInfo()
      {
          Session::get(self::USER_INFO_SESSION);
      }
      //--------------------------設定和獲取使用者的許可權
      // 設定使用者的資訊
      public function setUserRole($value)
      {
          Session::set(self::USER_ROLE_SESSION, $value);
      }
      // 獲取使用者的資訊
      public function getUserRole()
      {
          Session::get(self::USER_ROLE_SESSION);
      }
      //-------------------------使用者退出清空使用者快取資訊
      // 退出登入
      public function clear()
      {
          Session::del(self::USER_INFO_SESSION);
          Session::del(self::USER_ROLE_SESSION);
          Session::del(self::LOGIN_MARK_SESSION_KEY);
      }
}

建立門面類代理工具類SC

配置門面類

建立門面類SC

 建立鉤子

原始碼:

<?php

namespace app\behavior;

use Config;
use think\Facade;
use think\Loader;

class LoadBehavior
{
    public function run()
    {
        // 門面類facade註冊
        Facade::bind(Config::get('facade.facade'));
        // 別名註冊
        Loader::addClassAlias(Config::get('facade.alias'));
    }
}

初始化鉤子

下來就可以直接在service/UserService中使用了

這樣就解決了登入後資訊儲存的方便,還有一個方法就是使用者退出後清除session的儲存資訊,也只需要一個方法即可,在專案中給我們提供了很大的方便性