认证

认证是鉴定用户身份的过程。它通常使用一个标识符(如用户名)和一个加密令牌(比如密码或者存取令牌)来鉴别用户身份。认证是登录功能的基础。认证功能由 ginkgo\Auth 类完成。

0.1.2 新增


用户登录的典型过程

注意:以下例子仅作为说明,所有数据未经验证过滤,不宜作为登录程序直接使用。

  1. $auth = Auth::instance();
  2. $user = Loader::modal('User');
  3. // 从表单取得数据
  4. $inputSubmit = array(
  5. 'user_name' => $_POST['user_name'],
  6. 'user_pass' => $_POST['user_pass'],
  7. );
  8. // 从数据库读取用户信息
  9. $userRow = $user->read($inputSubmit['user_name'], 'user_name');
  10. if (!$userRow) {
  11. return '用户不存在';
  12. }
  13. // 验证密码
  14. $cryptString = Crypt::crypt($inputSubmit['user_pass'], $userRow['user_rand']);
  15. if ($cryptString != $userRow['user_pass']) {
  16. return '密码错误';
  17. }
  18. // 写入认证信息
  19. $auth->write($userRow);

读取当前登录用户的典型过程

注意:以下例子仅作为说明,所有数据未经验证过滤,不宜作为登录程序直接使用。

  1. $auth = Auth::instance();
  2. $user = Loader::modal('User');
  3. // 读取认证信息
  4. $authRow = $auth->read();
  5. $session = $authRow['session'];
  6. $remember = $authRow['remember'];
  7. // 从数据库读取用户信息
  8. $userRow = $user->read($session['user_id']); // 用会话数据读取
  9. if (!$userRow) { // 如不存在则用记住信息读取 (相当于自动登录)
  10. $userRow = $user->read($remember['user_id']);
  11. if (!$userRow) { // 如不存在则直接报错
  12. return '用户不存在';
  13. }
  14. }
  15. // 检测认证
  16. if (!$auth->check($userRow) {
  17. return $auth->getError();
  18. }
  19. ... // 继续其他操作

实例化认证类

认证在使用之前,需要进行实例化操作。

  1. $config = array(
  2. 'session_expire' => 20 * GK_MINUTE, // 认证过期时间
  3. 'remember_expire' => 30 * GK_DAY, // 记住密码过期时间
  4. );
  5. $auth = Auth::instance($config);

或者通过定义配置参数的方式,在配置文件中添加:

  1. 'auth' => array(
  2. 'session_expire' => 20 * GK_MINUTE, // 认证过期时间
  3. 'remember_expire' => 30 * GK_DAY, // 记住密码过期时间
  4. ),

认证参数如下:

参数 描述 默认
session_expire 认证有效期(单位为 秒) 12000
remember_expire 记住密码有效期(单位为 秒) 2592000

设置、取得前缀

很多系统可能会存在两个甚至数个登录通道,比如一个论坛系统存在普通用户登录与后台管理用户登录,普通用户登录后可以进行发帖、回复、评论等操作,管理员登录后,可以对整个论坛系统进行设置等操作,此时如果是同样的 ID,就存在冲突的可能性,为不同的登录通道设置不同的前缀可以有效避免冲突。

在实例化时设置前缀,如:

  1. $auth = Auth::instance(array(), 'user');

通过 prefix 属性设置,如:

  1. $auth = Auth::instance();
  2. $auth->prefix = 'user';

通过 prefix 方法设置,如:

  1. $auth = Auth::instance();
  2. $auth->prefix('user');

prefix 属性和 prefix 方法还可以取得当前前缀,如:

  1. $auth = Auth::instance();
  2. echo $auth->prefix();
  3. echo $auth->prefix;

写入认证信息

  1. $userRow = array(
  2. 'user_id' => 2,
  3. 'user_name' => 'test',
  4. 'user_time_login' => 568445,
  5. 'user_ip' => '127.0.0.1',
  6. );
  7. $auth->prefix = 'user'; // 注意与 userRow 数组的名称对应
  8. $auth->write($userRow, true, 'auto', 'remember');

write 方法说明

  1. function write( $userRow [, $regen = false [, $loginType = 'form' [, $remember = '' [, $pathCookie = '/']]]] )

参数

  • userRow 用户信息:

    必须为数组,结构如下:

    | 名称 | 类型 | 必需 | 描述 | | - | - | - | - | | 前缀_id | int | true | ID | | 前缀_name | string | true | 用户名 | | 前缀_time_login | int | true | 最后登录时间(UNIX 时间戳) | | 前缀_ip | string | true | IP 地址 |

  • regen 使用新生成的会话 ID 更新现有会话 ID

    布尔值,默认为 false

  • loginType 登录类型

    字符串,默认为 form,表示从表单登录,开发者可以根据实际情况自行命名,如:auto 等等

  • remember 记住登录状态

    字符串,默认为空,要记住登录状态,必须将本参数设置为 remember

  • pathCookie Cookie 保存路径

    字符串,默认 /

返回


读取认证

  1. $authinfo = $auth->read();

参数

返回

  • 数组,结构如下:

    1. array(
    2. 'session' => array( // 会话
    3. '前缀_id' => 2, // 用户 ID
    4. '前缀_name' => 'username', // 用户名
    5. '前缀_hash' => 'dfekeiEjiweerw', // 哈希值
    6. '前缀_time' => 54684857, // 保存时间
    7. '前缀_time_expire' => 46744874, // 过期时间
    8. ),
    9. 'cookie' => array( // Cookie
    10. '前缀_id' => 2,
    11. '前缀_name' => 'username', // 用户名
    12. '前缀_hash' => 'dfekeiEjiweerw',
    13. '前缀_time' => 54684857,
    14. '前缀_time_expire' => 46744874,
    15. ),
    16. 'remember' => array( // 记住的登录状态
    17. '前缀_id' => 2,
    18. '前缀_name' => 'username', // 用户名
    19. '前缀_hash' => 'dfekeiEjiweerw',
    20. '前缀_time' => 54684857,
    21. '前缀_time_expire' => 46744874,
    22. ),
    23. );

检测认证

  1. $auth->check($userRow, $pathCookie);

check 方法说明

  1. function check( $userRow [, $pathCookie = '/'] )

参数

  • userRow 用户信息:

    必须为数组,结构如下:

    | 名称 | 类型 | 必需 | 描述 | | - | - | - | - | | 前缀_id | int | true | ID | | 前缀_name | string | true | 用户名 | | 前缀_time_login | int | true | 最后登录时间(UNIX 时间戳) | | 前缀_ip | string | true | IP 地址 |

  • pathCookie Cookie 保存路径

    字符串,默认 /

返回

  • 布尔值

结束认证

用户结束登录

  1. $auth->end();

获取错误信息

  1. $auth->getError();