qingbing/pf-abstracts-web-user

抽象——用户登录组件

1.0.1 2019-03-19 15:47 UTC

README

描述

抽象——用户登录组件

注意事项

  • 该小部件基于"qingbing/php-session","qingbing/php-web"开发
  • 需要配置"application.session"组件
  • 需要配置"application.user"组件(用户管理组件,方便在项目中使用)
  • 登录认证(Abstracts\UserIdentity)
    • 认证的主题方法(authenticate())需要自行继承实现
    • 认证的代码及意义
      • ERROR_NONE : 0, 正常登录
      • ERROR_USERNAME_INVALID : 1, 无效的登录账户
      • ERROR_PASSWORD_INVALID : 2, 无效的登录密码
      • ERROR_USER_FORBID : 3, 用户被禁用
      • ERROR_UNKNOWN_IDENTITY : 100, 未知错误信息
  • 登录组件(Abstracts\WebUser)
    • 属性介绍
      • cookieKey : 采用cookie记录登录信息时的 key
      • rememberTime : 记录时的有效时长(单位:秒)
      • namespace : 登录状态命名空间
      • expire : 登录状态保存有效时间
      • prefix : 保存名前缀
      • loginUrl : 登录的 action
      • returnUrl : 登录后默认跳转的 action
      • openToken : 开启记录登录 token
    • 重要方法
      • getIsGuest() : 判断当前是否有账户登录
      • loginRequired() : 必须登录的验证,没有登录会直接跳转到登录页面
      • login(UserIdentity $identity, $isRemember = false) : 登录系统
      • logout() : 退出当前系统
      • getState($name) : 按名称获取保存的值(session)
      • getUsername() : 获取当前登录的账户名
      • setUid($uid) : 设置当前登录用户的ID,该函数只在登录时使用或不使用
      • getUid() : 获取当前登录用户的ID
      • setIsSuper($val) : 设置当前登录用户的ID,该函数只在登录时使用或不使用
      • getIsSuper() : 获取当前登录用户的ID
      • getToken() : 获取登录时的token,当开始了token验证时才会生效
      • isToken($token) : 判断是否为登录时的token,当开始了token验证时才有意义
      • getAccessCodes() : 获取登录账户的权限代码,需要在继承类中调用 setAccessCodes($accessCodes = []) 来设置数组类型的权限代码
      • hasAccess($code) : 判断是否有指定代码权限
      • getUserInfo() : 返回当前登录用户的信息,需要继承类中实现 "abstract protected function getUser();"

使用方法

1. 登录表单

class TestLoginForm extends FormModel
{
    public $username;
    public $password;
    private $_identity;

    /**
     * 验证规则
     * @return array
     */
    public function rules()
    {
        return [
            ['username', 'username'],
            ['password', 'password'],
            ['password', 'authenticate'],
        ];
    }

    /**
     * 验证用户登录密码
     * @param string $attribute
     */
    public function authenticate($attribute)
    {
        if (!$this->hasErrors()) {
            $this->_identity = new TestUserIdentity($this->username, $this->password);
            if (0 != $this->_identity->authenticate()) {
                $this->addError($attribute, $this->_identity->getErrorMsg());
            }
        }
    }

    /**
     * 用户登录
     * @return bool
     * @throws \Exception
     */
    public function login()
    {
        if ($this->validate()) {
            if (!App::getInstance()->getUser()->login($this->_identity)) {
                $this->addError('username', "登录失败");
            } else {
                return true;
            }
        }
        return false;
    }
}

2. UserIdentity 认证实现


class TestUserIdentity extends UserIdentity
{
    private $_user;

    /**
     * 验证用户登陆
     * @return bool
     */
    public function authenticate()
    {
        if (empty($this->username)) {
            $this->errorCode = self::ERROR_USERNAME_INVALID;
        } else {
            $user = App::getInstance()->findUserByUsername($this->username);
            if (empty($user)) {
                $this->errorCode = self::ERROR_USERNAME_INVALID;
            } else if (!$user['is_enable']) {
                $this->errorCode = self::ERROR_USER_FORBID;
            } else if ($user['password'] != $this->password) {
                $this->errorCode = self::ERROR_PASSWORD_INVALID;
            } else {
                $this->errorCode = self::ERROR_NONE;
                $this->_user = $user;
            }
        }
        return $this->errorCode;
    }

    /**
     * 获取登录验证用户
     * @return array
     */
    public function getUser()
    {
        return $this->_user;
    }
}

3. WebUser 用户组件实现

class TestWebUser extends WebUser
{
    /**
     * 获取当前登录用户的信息
     * @return array
     */
    protected function getUser()
    {
        return App::getInstance()->findUserByUid($this->getUid());
    }

    /**
     * 登录成功后调用,如果使用需要子类重写
     * @param \TestApp\TestUserIdentity $identity
     * @throws \Exception
     */
    protected function afterLogin($identity)
    {
        $user = $identity->getUser();
        // 登录后记录日志等相关信息
        $this->setUid($user['uid']);
        parent::afterLogin($identity);
    }

    /**
     * 退出之前调用,如果使用需要子类重写
     * @return bool
     */
    protected function beforeLogout()
    {
        return true;
    }
}

====== 异常代码集合 ======

异常代码格式:1031 - XXX - XX (组件编号 - 文件编号 - 代码内异常)

 - 无