zoukankan      html  css  js  c++  java
  • 多终端数据共享

    多终端数据共享

    基于Token

    多终端共享需要明确两点:

    • 各个终端的登录时长互不影响
    • 各个终端的用户数据一致

    实现多终端数据共享还有其他方法,下面举例一个我在项目中用的方法。

    代码如下:

    /**
     * 用户登录
     * @param string $login 登录名
     * @param string $password 登录密码
     * @return UserModel|false
     */
    function userLogin($login, $password) {
        $user = UserModel::where('login', $login)->first();
        if ($user && $user->checkPassword($password)) {
            $token = $user->generateAuthToken();
            session()->put('_token', $token);
            // 认证
            cache()->put('user_token_' . $token, $user->id);
            // 数据
            cache()->put('user_' . $user->id, $user);
            return $user;
        } else {
            return false;
        }
    }
    
    /**
     * 获取已经登录的用户实例
     * @return UserModel|null
     */
    function getLoginUser($token = null) {
        if (! $token) $token = session()->get('_token');
        $token_cache_key = 'user_token_' . $token;
        $user_id = cache()->get($token_cache_key);
        if (! $user_id) return null; // token失效,认证过期
        
        $user_cache_key = 'user_' . $user_id;
        $user = cache()->get($user_cache_key);
        if (! $user) {
            // 缓存失效,重新缓存
            $user = UserModel::find($user_id);
            cache()->put($user_cache_key, $user);
        }
        return $user;
    }
    

    这种认证方式下,token只能解析出user_id,这就好比是一个用户指针,系统再由user_id解析出用户实例。这样可以保证,不同终端拿到不同的token,这些token的过期时间不会相互影响,而不同token可以拿到同一个用户数据,从而实现多终端用户数据共享。

    getLoginUser函数,先检查token是否失效,再进一步检查用户实例缓存是否失效。

    账号激活

    多终端数据共享的应用场景也很广泛,比如账号激活,发一份Email邮件,让用户点击链接进行账号激活。在激活操作里,系统需要知道用户想要激活那个账号,一个通常的做法如下:

    /**
     * 生成用于激活账号的链接
     * @return string 用于激活的uri
     */
    function generateActivateLink() {
        $code = md5('activate' . Auth::id() . time());
        cache()->put($code, Auth::id());
      	// `url()`函数,是laravel中用于生成完整url的函数。
        return url('/user/activate?code=' . $code);
    }
    
    /**
     * 激活用户
     * @param string $code 激活码
     * @return string 用于激活的uri
     */
    function activateUser($code) {
        $user_id = cache()->get($code);
        if (! $user_id) return false;
        // 修改数据库
        $user = UserModel::find($user_id);
      	// 修改用户的`status`字段值为`STATUS_ACTIVATED`对应的值。
        $user->status = UserModel::STATUS_ACTIVATED;
      	// 保存修改的信息到数据库。
        $user->save();
        // 修改缓存
        $user_cache_key = 'user_' . $user_id;
        if (cache()->get($user_cache_key)) {
            cache()->put($user_cache_key, $user);
        }
        return $user;
    }
    

    可以看到,生成的激活链接中的code其实是缓存键,使用code可以获取到用户id,这样系统就知道了需要激活哪个用户。

    在激活时,系统只需要修改缓存中的用户实例即可,用户不需要重新登录账号以刷新缓存中的数据。

  • 相关阅读:
    shell函数使用
    laravel调试神器tinker
    laravel 5.1 单元测试 Cannot modify header information 错误
    angular 使用rxjs 监听同级兄弟组件数据变化
    angular 有关侦测组件变化的 ChangeDetectorRef 对象
    XML文件操作类--创建XML文件
    (收藏)C#实现截屏
    (转)C#操作PPT
    (转).NET代码混淆实践
    (整理)RPC
  • 原文地址:https://www.cnblogs.com/fhkankan/p/13023834.html
Copyright © 2011-2022 走看看