当前位置: 首页 > 知识库问答 >
问题:

Laravel手动认证

桓喜
2023-03-14

我在办公室里有一个本地服务器,它存储网络用户的所有Active Directory详细信息,例如用户名、电子邮件、电话号码、普通广告等。

我有一个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));
        }
    }
}

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

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

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

更新:

我没有使用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');
            }
        }
    }

共有1个答案

汪胤
2023-03-14

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

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

我在Laravel DB中保留该用户的权限(管理员,报告等)。

 类似资料:
  • 我有一个springboot应用程序,它侦听Kafka流并将记录发送到某个服务以进行进一步处理。服务有时可能会失败。注释中提到了异常情况。到目前为止,我自己模拟了服务成功和异常场景。 侦听器代码: 用户工厂配置如下: 由于REST服务正在抛出RestClientException,它应该进入上面提到的if块。关于FixedBackOff,我不希望SeekToCurrentErrorHandler执

  • 我在Laravel 5.5中使用手动登录功能。卡在登录。并检查所有(5个相关)堆栈链接,但没有找到任何线索。 成就是一旦用户注册,自动登录该用户。 错误是 msgstr"类型错误:传递给Illumate\Auth\SessionGuar的参数1d::登录()必须实现接口Illumate\Contts\Auth\Authentiable,字符串给定,在服务器/供应商/laravel/框架/src/I

  • 我一直试图让Laravel的新版本(5.2)与一个简单的网络应用程序一起工作。然而,我在身份验证方面遇到了问题。 应用程序的所有页面都包括一个导航视图部分,使用Auth::user()- 为了做到这一点,我创建了一个页面控制器,它在构造函数中加载auth中间件: 如果用户已登录,则此操作非常有效。但是,如果用户没有登录,则要求他们在每个页面上登录。即使是像“联系人”或“关于”这样显然不需要身份验证

  • 更新代码库后,我收到一个错误,我似乎无法绕过它。我已经使用了一个我不再使用的包,我通过了正确的步骤来删除这个包,就像这个答案一样,但是我在控制台上做的任何事情都失败了。 我试着跑步: 但我收到这个错误: 我已尝试运行这些命令,但收到相同的错误: 我的问题是,因为这看起来像是只是拿起一个已编译类的缓存版本,有没有办法手动删除已编译的缓存,因为我不能通过命令来处理它?

  • 我是Laravel的新手,我听说Laravel的登录和注册系统是默认的。然而,我不能利用它。我已经将登录和注册视图放在资源/视图/的Auth目录中。 我在: 路线是: 但我得到了这个错误: AuthenticatesAndRegistersUsers中的FatalErrorException。php第11行:为illumb\Foundation\Auth\AuthenticatesUsers::g

  • 如何使用自定义身份验证方法对通道的用户进行身份验证? 例如,在我的应用程序中,我为我的API使用令牌认证(存储在每个用户的数据库中),通过标头传递,并由自定义中间件读取。 如何使用这些通道的自定义身份验证方法控制访问?客户端和服务器端如何?我使用socket.io和Laravel文档非常不清楚授权方法是如何工作的套接字。 使用案例: 我使用默认的Laravel迁移将用户存储在DB中。然而,我的应用