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 数据库中保留该用户的权限(管理员、报告等)。
我在办公室有一台本地服务器,它存储网络上用户的所有 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 数据库中保留该用户的权限(管理员、报告等)。