validated(); $username = $credentials['username']; $password = $credentials['password']; $ip = $request->ip(); $user = User::where('username', $username)->first(); if ($user) { // 用户存在,验证密码 if (Hash::check($password, $user->password)) { // Bcrypt 验证通过 // 检测是否被封禁 (后台管理员级别获得豁免权,防止误把自己关在门外) $adminLevel = (int) Sysparam::getValue('superlevel', '100'); if ($user->user_level < $adminLevel) { if ($user->user_level < 0) { return response()->json(['status' => 'error', 'message' => '您的账号已被管理员封禁,无法登录。'], 403); } if (Redis::sismember('banned_ips', $ip)) { return response()->json(['status' => 'error', 'message' => '您所在的 IP 地址已被管理员封禁,限制访问。'], 403); } } $this->performLogin($user, $ip); return response()->json(['status' => 'success', 'message' => '登录成功']); } // 退化为 MD5 验证(兼容原 ASP 系统的老密码) if (md5($password) === $user->password) { // MD5 验证通过,升级密码为 Bcrypt $user->password = Hash::make($password); $user->save(); // 检测是否被封禁 (后台管理员级别获得豁免权,防止误把自己关在门外) $adminLevel = (int) Sysparam::getValue('superlevel', '100'); if ($user->user_level < $adminLevel) { if ($user->user_level < 0) { return response()->json(['status' => 'error', 'message' => '您的账号已被管理员封禁,无法登录。'], 403); } if (Redis::sismember('banned_ips', $ip)) { return response()->json(['status' => 'error', 'message' => '您所在的 IP 地址已被管理员封禁,限制访问。'], 403); } } $this->performLogin($user, $ip); return response()->json(['status' => 'success', 'message' => '登录成功,且安全策略已自动升级']); } // 密码错误 return response()->json([ 'status' => 'error', 'message' => '密码错误,请重试。', ], 422); } // --- 核心:第一次登录即为注册 --- // 映射性别:1=男 2=女 0=保密(数据库 sex 列为 int) $sex = (int) $request->input('bSex', 0); if (! in_array($sex, [1, 2])) { $sex = 0; } // 新注册用户:只检测 IP 封禁 (新号不存在账号封禁) if (Redis::sismember('banned_ips', $ip)) { return response()->json(['status' => 'error', 'message' => '您所在的 IP 地址已被管理员封禁,禁止注册新账号。'], 403); } $newUser = User::create([ 'username' => $username, 'password' => Hash::make($password), 'first_ip' => $ip, 'last_ip' => $ip, 'user_level' => 1, // 默认普通用户等级 'sex' => $sex, 'usersf' => '1.gif', // 默认头像 ]); $this->performLogin($newUser, $ip); return response()->json(['status' => 'success', 'message' => '注册并登录成功!']); } /** * 执行实际的登录操作并记录时间、IP 等。 */ private function performLogin(User $user, string $ip): void { Auth::login($user); // 递增访问次数 $user->increment('visit_num'); // 更新最后登录IP和时间 $user->update([ 'last_ip' => $ip, 'log_time' => now(), 'in_time' => now(), ]); // 可选:将用户登录状态也同步写入原有的 IpLog 模型,以便数据归档查询 \App\Models\IpLog::create([ 'ip' => $ip, 'sdate' => now(), 'uuname' => $user->username, ]); } /** * 退出登录,清除会话后跳转回登录首页 */ public function logout(Request $request): \Illuminate\Http\RedirectResponse { if (Auth::check()) { $user = Auth::user(); // 记录退出时间和退出信息 $user->update([ 'out_time' => now(), 'out_info' => '正常退出了聊天室', ]); } Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/')->with('success', '您已成功退出聊天室,欢迎下次再来!'); } }