nyarime 发表于 2024-10-16 15:39:04

修改 Discuz! X3.5 的登录 Cookie 有效期

## 简介

在 Discuz! X3.5 中,用户的登录状态默认使用 Session Cookie。这意味着,当用户关闭浏览器后,登录状态会失效。如果我们希望延长登录状态的有效期,例如保持 30 天,可以通过修改源码中的相关部分来实现。

本教程将详细讲解如何修改 Discuz! X3.5 的登录 Cookie 有效期。

## 步骤 1:找到 `setloginstatus()` 函数

首先,我们需要找到负责设置用户登录状态的函数 `setloginstatus()`。

### 文件路径:

- `/source/class/class_member.php`

在这个文件中,`setloginstatus()` 函数用于设置用户的登录状态,包括相关的登录 Cookie(如 `dz_auth`)。

找到以下代码行:

```php
setloginstatus($result['member'], $_GET['cookietime'] ? 2592000 : 0);
```

这段代码使用了一个三元运算符,根据用户是否选择了“记住我”选项来决定登录状态的有效期:

- `$_GET['cookietime'] ? 2592000 : 0`:
- 如果 `$_GET['cookietime']` 存在且为真,则有效期为 2592000 秒(30 天)。
- 如果 `$_GET['cookietime']` 不存在或为假,则有效期为 0(即 Session Cookie,浏览器关闭后失效)。

## 步骤 2:修改有效期

为了让登录状态的有效期固定为 30 天,无论用户是否选择“记住我”,我们可以修改上面的代码,将三元运算符替换为固定值:

### 修改前:

```php
setloginstatus($result['member'], $_GET['cookietime'] ? 2592000 : 0);
```

### 修改后:

```php
setloginstatus($result['member'], 2592000);// 固定设置为 30 天
```

通过这一修改,用户登录后的 Cookie 有效期将始终为 30 天。

## 步骤 3:保存并测试

1. **保存修改**:在 `function_member.php` 文件中保存上述修改。
2. **清理缓存**:清除浏览器中的 Cookie 和缓存。
3. **重新登录**:重新登录 Discuz! 论坛,并关闭浏览器,检查是否保持登录状态。
4. **验证有效期**:验证登录状态是否在 30 天内保持有效。

## 注意事项

- 在进行任何代码修改之前,务必**备份**你的文件,以便在出现问题时能够恢复。
- 这次修改针对登录状态的 Cookie 设置,不会影响其他 Cookies 的行为。
- 修改后,用户每次登录都会保持 30 天的有效期,而不再受“记住我”选项的影响。

## 结论

通过简单的代码修改,我们可以轻松将 Discuz! X3.5 中的登录 Cookie 有效期从默认的 Session 改为固定的 30 天。这不仅提升了用户体验,还避免了用户频繁重新登录的麻烦。

Dream 发表于 2024-10-30 02:15:59

貌似最新版的x3.5只有这段代码 function setloginstatus($member, $cookietime) {
        global $_G;
        $_G['uid'] = intval($member['uid']);
        $_G['username'] = $member['username'];
        $_G['adminid'] = $member['adminid'];
        $_G['groupid'] = $member['groupid'];
        $_G['formhash'] = formhash();
        $_G['session']['invisible'] = getuserprofile('invisible');
        $_G['member'] = $member;
        loadcache('usergroup_'.$_G['groupid']);
        C::app()->session->isnew = true;
        C::app()->session->updatesession();

        dsetcookie('auth', authcode("{$member['password']}\t{$member['uid']}", 'ENCODE'), $cookietime, 1, true);
        dsetcookie('loginuser');
        dsetcookie('activationauth');
        dsetcookie('pmnum');

        include_once libfile('function/stat');
        updatestat('login', 1);
        if(defined('IN_MOBILE')) {
                updatestat('mobilelogin', 1);
        }
        if($_G['setting']['connect']['allow'] && $_G['member']['conisbind']) {
                updatestat('connectlogin', 1);
        }
        $rule = updatecreditbyaction('daylogin', $_G['uid']);
        if(!$rule['updatecredit']) {
                checkusergroup($_G['uid']);
        }
}

nyarime 发表于 2025-4-15 20:58:29

Dream 发表于 2024-10-30 02:15
貌似最新版的x3.5只有这段代码

弄错路径了,是/source/class/class_member.php
页: [1]
查看完整版本: 修改 Discuz! X3.5 的登录 Cookie 有效期