Laravel 手动验证

Laravel manual authentication

我在办公室有一台本地服务器,它存储网络上用户的所有 Active Directory 详细信息,例如用户名、电子邮件、phone 号码、普通 AD 内容。

我有一个 PHP 脚本,它使用 LDAP 查询检索内部网络上当前登录用户的详细信息,从而为当前登录用户提供访问这些详细信息的权限。

这也用于用用户预填充用户数据库。

然后我有一个 Laravel 应用程序,它使用这些详细信息作为身份验证,绕过标准登录屏幕。

目前,我将用户发送到一个内部页面,在那里他们按下一个按钮,将我使用 LDAP 检索到的所有信息发布到所述应用程序。当它到达应用程序时,我将这些详细信息存储在会话中并以这种方式使用它们。

我能否在 Laravel 的 Auth 中间件中使用这些凭据,以便将用户视为已登录?

我觉得将他们所有的数据塞进会话中并没有真正取得多大成就。

我把Auth/LoginController改成了这样:

public function authenticate(Request $request)
    {
        // The email retrieved from the POST request
        $emailAddress = $request->get('EM');
        // Try to get this user from the User table
        $currentUser = User::where('email', $emailAddress)->get()->first();

        // If the query returned something
        if ($currentUser != null)
        {
            // Login this user
            Auth::login($currentUser);

            if($currentUser = Auth::check())
            {  
                $request->session()->put('User_name', $request->get('UN'));
                $request->session()->put('Container_name', $request->get('CN'));
                $request->session()->put('Display_name', $request->get('DN'));
                $request->session()->put('Job_Title', $request->get('JT'));
                $request->session()->put('Department', $request->get('DP'));
                $request->session()->put('Office', $request->get('OF'));
                $request->session()->put('Email', $request->get('EM'));
                $request->session()->put('Phone', $request->get('DD'));
                $request->session()->put('Mobile', $request->get('MO'));
                $request->session()->put('Manager_User_name', $request->get('MUN'));
                $request->session()->put('Manager_Container_name', $request->get('MCN'));

                return view('pages.index');
        }
        else
        {
            echo "We don't know you";
            echo $user;

            var_dump(Auth::login($user));
        }
    }
}

基本上我会根据给定的数据检查用户数据库,然后手动登录用户。此时,我再将他们的数据存储在session中。

如果数据不在用户数据库中,我想添加它们。

这是控制器任务还是中间件任务?

一个更新:

我没有使用 MiddleWare,而是使用了这段代码:

public function checkUserExists(Request $request)
    {
        $email = $request->get('EM');
        $user = User::where('email', $emailAddress)->get()->first();

        if($user->isEmpty())
        {
            // If this user was not found
            $user = User::create(
                [
                    'username' => $request->get('UN'),
                    'displayName' => $request->get('DN'),
                    'email' => $request->get('EM'),
                    'role' => $request->get('JT'),
                    'department' => $request->get('DP'),
                    'location' => $request->get('OF'),
                    'directDialIn' => $request->get('DDI'),
                    'mobileNumber' => $request->get('MO'),
                    'managedByUsername' => $request->get('MUN'),
                    'managedByDisplayName' => $request->get('MCN')
                ]
            )
        }
        else
        {
            // If this user was found update their details
            $user->update(
               [
                'username' => $request->get('UN'),
                'displayName' => $request->get('DN'),
                'email' => $request->get('EM'),
                'role' => $request->get('JT'),
                'department' => $request->get('DP'),
                'location' => $request->get('OF'),
                'directDialIn' => $request->get('DDI'),
                'mobileNumber' => $request->get('MO'),
                'managedByUsername' => $request->get('MUN'),
                'managedByDisplayName' => $request->get('MCN')
               ]
            );

            $request->session()->put('Container_name', $request->get('CN'));
            $request->session()->put('Display_name', $request->get('DN'));
            $request->session()->put('Job_Title', $request->get('JT'));
            $request->session()->put('Department', $request->get('DP'));
            $request->session()->put('Office', $request->get('OF'));
            $request->session()->put('Email', $request->get('EM'));
            $request->session()->put('Phone', $request->get('DD'));
            $request->session()->put('Mobile', $request->get('MO'));
            $request->session()->put('Manager_User_name', $request->get('MUN'));
            $request->session()->put('Manager_Container_name', $request->get('MCN'));

            // Login this user
            Auth::login($user);

            if($user = Auth::check())
            {
                return view('pages.index');
            }
        }
    }

我修改了 AuthController 以从 Active Directory 获取身份验证,如果它通过,我将它们与 Laravel 数据库中的用户记录匹配并手动登录用户:

Auth::loginUsingId($user->id);

我在 Laravel 数据库中保留该用户的权限(管理员、报告等)。