---
url: /docs/5.0/server/auth.md
---
# 用户认证

> CatchAdmin 如何获取登录用户信息? 获取当前登录人信息的完整指南

CatchAdmin 提供了 `Admin` Facade 来处理后台用户认证相关的操作，包括获取当前登录用户、获取登录人信息、用户 ID、退出登录等功能。本文将详细介绍如何在 CatchAdmin 后台管理系统中获取和操作登录用户信息。

## 快速开始

在 CatchAdmin 中获取当前登录用户非常简单，只需要引入 `Admin` Facade 即可：

```php
use Catch\Facade\Admin;

// 获取当前登录用户
$user = Admin::currentLoginUser();

// 获取当前登录用户 ID
$userId = Admin::id();
```

## 获取当前登录用户

在控制器或其他业务逻辑中，可以通过 `Admin::currentLoginUser()` 获取当前登录的用户模型。这是 CatchAdmin 中获取登录人信息最常用的方法：

```php
use Catch\Facade\Admin;

// 获取当前登录用户
$user = Admin::currentLoginUser();

// 获取用户信息
$username = $user->username;
$email = $user->email;
```

:::tip
`currentLoginUser()` 返回的是 `Modules\User\Models\User` 模型实例，可以直接访问用户的所有属性和关联关系。
:::

## 获取当前登录用户 ID

如果只需要获取用户 ID，可以使用更简洁的方式：

```php
use Catch\Facade\Admin;

// 获取当前登录用户 ID
$userId = Admin::id();
```

## 用户认证

`Admin::auth()` 方法用于验证用户身份，通常在中间件中调用。如果你需要手动进行用户认证，可以这样使用：

```php
use Catch\Facade\Admin;

try {
    $user = Admin::auth();
    // 认证成功，继续业务逻辑
} catch (\Illuminate\Auth\AuthenticationException $e) {
    // 认证失败处理
}
```

:::info
一般情况下，不需要手动调用 `auth()` 方法，CatchAdmin 的 `AuthMiddleware` 中间件会自动处理用户认证。
:::

## 退出登录

用户退出登录时，调用 `logout()` 方法：

```php
use Catch\Facade\Admin;

Admin::logout();
```

该方法会：

* 清除用户的个人令牌缓存
* 删除数据库中的 Token 记录

## 清理缓存

### 清理指定用户令牌缓存

```php
use Catch\Facade\Admin;

// 清理当前用户的令牌缓存
Admin::clearUserPersonalToken();

// 清理指定 tokenId 的缓存
Admin::clearUserPersonalToken($tokenId);
```

### 清理所有缓存用户

```php
use Catch\Facade\Admin;

Admin::clearAllCachedUsers();
```

:::warning
`clearAllCachedUsers()` 会清理所有已缓存的用户信息，请谨慎使用。
:::

## 使用示例

### 在控制器中使用

```php
<?php

namespace Modules\User\Http\Controllers;

use Catch\Base\CatchController;
use Catch\Facade\Admin;

class ProfileController extends CatchController
{
    /**
     * 获取当前用户信息
     */
    public function info()
    {
        $user = Admin::currentLoginUser();

        return [
            'id' => $user->id,
            'username' => $user->username,
            'email' => $user->email,
        ];
    }

    /**
     * 更新当前用户信息
     */
    public function update(Request $request)
    {
        $user = Admin::currentLoginUser();

        $user->update($request->only(['username', 'email']));

        return $user;
    }
}
```

### 在服务类中使用

```php
<?php

namespace Modules\Order\Services;

use Catch\Facade\Admin;

class OrderService
{
    /**
     * 创建订单
     */
    public function create(array $data)
    {
        // 获取当前操作用户 ID
        $data['creator_id'] = Admin::id();

        return Order::create($data);
    }
}
```

## API 参考

| 方法 | 返回值 | 说明 |
| --- | --- | --- |
| `Admin::auth()` | `User` | 用户认证，返回用户模型 |
| `Admin::currentLoginUser()` | `User\|null` | 获取当前登录用户信息 |
| `Admin::id()` | `int\|null` | 获取当前登录用户 ID |
| `Admin::logout()` | `true` | 退出登录 |
| `Admin::clearUserPersonalToken($tokenId)` | `void` | 清理指定令牌缓存 |
| `Admin::clearAllCachedUsers()` | `void` | 清理所有缓存用户 |

## 常见问题

### 如何判断用户是否已登录？

```php
use Catch\Facade\Admin;

if (Admin::currentLoginUser()) {
    // 用户已登录
} else {
    // 用户未登录
}
```

### 获取登录用户信息返回 null 怎么办？

如果 `Admin::currentLoginUser()` 返回 `null`，可能是以下原因：

1. 用户未登录或 Token 已过期
2. 请求未经过 `AuthMiddleware` 中间件
3. Token 格式不正确
