관리-도구
편집 파일: LoginController.php
<?php namespace App\Http\Controllers\Admin\Auth; use App\Models\Admin; use App\Enums\UserRole; use App\Enums\SessionKey; use Illuminate\Http\Request; use App\Services\AdminService; use App\Traits\RecaptchaTrait; use App\Services\RecaptchaService; use Illuminate\Contracts\View\View; use Illuminate\Http\RedirectResponse; use Illuminate\Support\Facades\Session; use App\Http\Controllers\BaseController; use Devrabiul\ToastMagic\Facades\ToastMagic; use Illuminate\Database\Eloquent\Collection; use Illuminate\Pagination\LengthAwarePaginator; class LoginController extends BaseController { use RecaptchaTrait; public function __construct(private readonly Admin $admin, private readonly AdminService $adminService) { $this->middleware('guest:admin', ['except' => ['logout']]); } public function index(?Request $request, ?string $type = null): View|Collection|LengthAwarePaginator|null|callable { $loginTypes = [ UserRole::ADMIN => getWebConfig(name: 'admin_login_url'), UserRole::EMPLOYEE => getWebConfig(name: 'employee_login_url') ]; $userType = array_search($type, $loginTypes); abort_if(!$userType, 404); $recaptchaBuilder = $this->generateDefaultReCaptcha(4); Session::put(SessionKey::ADMIN_RECAPTCHA_KEY, $recaptchaBuilder->getPhrase()); $recaptcha = getWebConfig(name: 'recaptcha'); return view('admin-views.auth.login', compact('recaptchaBuilder', 'recaptcha'))->with(['role' => $userType]); } public function generateReCaptcha() { $recaptchaBuilder = $this->generateDefaultReCaptcha(4); if (Session::has(SessionKey::ADMIN_RECAPTCHA_KEY)) { Session::forget(SessionKey::ADMIN_RECAPTCHA_KEY); } Session::put(SessionKey::ADMIN_RECAPTCHA_KEY, $recaptchaBuilder->getPhrase()); header("Cache-Control: no-cache, must-revalidate"); header("Content-Type:image/jpeg"); $recaptchaBuilder->output(); } public function login(Request $request): RedirectResponse { $sessionKey = ($request['role'] == 'admin') ? SessionKey::ADMIN_RECAPTCHA_KEY: SessionKey::EMPLOYEE_RECAPTCHA_KEY; $result = RecaptchaService::verificationStatus(request: $request, session: $sessionKey, action: "login"); if ($result && !$result['status']) { ToastMagic::error($result['message']); return back(); } $admin = $this->admin->where('email', $request['email'])->first(); if (isset($admin) && in_array($request['role'], [UserRole::ADMIN, UserRole::EMPLOYEE]) && $admin->status) { if ($admin['id'] == 1 && $request['role'] != 'admin') { return redirect()->back()->withInput($request->only('email', 'remember')) ->withErrors([translate('Please_login_from_the_admin_login_page')]); } if ($admin['id'] != 1 && $request['role'] != 'employee') { return redirect()->back() ->withInput($request->only('email', 'remember')) ->withErrors([translate('Please_login_from_the_employee_login_page')]); } if ($this->adminService->isLoginSuccessful($request['email'], $request['password'], $request['remember'])) { return redirect()->route('admin.dashboard.index'); } } ToastMagic::error(translate('credentials_does_not_match_or_your_account_has_been_suspended')); return redirect()->back()->withInput($request->only('email', 'remember')); } public function logout(): RedirectResponse { $authType = auth('admin')->id() == 1 ? 'admin' : 'employee'; $this->adminService->logout(); session()->flash('success', translate('logged out successfully')); if ($authType == 'employee') { return redirect('login/' . getWebConfig(name: 'employee_login_url')); } else { return redirect('login/' . getWebConfig(name: 'admin_login_url')); } } }