TP5.1用户登陆成功处理存储用户信息Session优化

author:咔咔

wechat:fangkangfk

 

源码:https://download.csdn.net/download/fangkang7/10749294php

 

在用户登陆成功后,咱们会将用户的信息存储到session中缓存

 

步骤:session

咱们在用户登陆后会储存不少的用户信息,也会设置不少的session的key,后期项目不方便维护和管理app

这就须要建立一个工具类来管理咱们的SESSION储存用户信息(app\util\SC),将咱们须要处理的全部的存储操做放置里边工具

在下来就是建立门面类(facade\SC)代理这个工具类,在这一步咱们须要建立config\facade。放置facade的配置ui

下来就须要建立钩子初始化this

 

源码:url

<?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;
    }
}

很明显为了保障方法的单一原则,咱们须要对用户登陆后的存储信心数据进行分离spa

咱们就能够建立一个方法来专门处理存储用户信息的操做.net

源码:

<?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的存储信息,也只须要一个方法便可,在项目中给咱们提供了很大的方便性 

相关文章
相关标签/搜索