v2board密码正确但是登录失败

曾经遇到过一个很诡异的现象,v2board密码都是对的,也提示了登录成功,但是就是登录失败,进入不了后台,有的用户不信邪,多次登录中会有一次成功。

开始以为是用户的账号密码错误,尝试过后台重置密码,还是一样的结果。

翻了翻对应的代码

AuthController.php 中的 login 方法。

常见的登录验证代码流程,只是其中最后一段,

1
2
3
4
$authService = new AuthService($user);
return response([
'data' => $authService->generateAuthData($request)
]);

跟着查看 generateAuthData方法,其中有一个 self::addSession方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public function generateAuthData(Request $request)
{
$guid = Helper::guid();
$authData = JWT::encode([
'id' => $this->user->id,
'session' => $guid,
], config('app.key'), 'HS256');
self::addSession($this->user->id, $guid, [
'ip' => $request->ip(),
'login_at' => time(),
'ua' => $request->userAgent()
]);
return [
'token' => $this->user->token,
'is_admin' => $this->user->is_admin,
'auth_data' => $authData
];
}

继续追代码,找到 addSession方法。

1
2
3
4
5
6
7
8
9
10
11
private static function addSession($userId, $guid, $meta)
{
$cacheKey = CacheKey::get("USER_SESSIONS", $userId);
$sessions = (array)Cache::get($cacheKey, []);
$sessions[$guid] = $meta;
if (!Cache::put(
$cacheKey,
$sessions
)) return false;
return true;
}

其中的Cacheget/put操作看起来是那么醒目,有编程基础的人,看到这里,想必已经能猜到原因了,权限问题。

找到缓存目录storage/framework/cache/data,果然是这个原因。

清一色的www权限,莫名出现了一个root权限目录。

这就造成了Session文件无法写入,也就造成了,明明登录成功了,但是却进入不了后台。

知道了问题,解决也就很容易了。

修改对应的cache文件目录权限。

chown www:www cache -R

再次登录,恢复正常。