Laravel:使用自定义保护/尝试方法在成功登录时设置cookie
我正在使用第三方数据库进行身份验证。一切都很好,但现在希望在用户登录时设置cookie 如合同所述: 如果身份验证成功,则尝试方法将返回true。否则,将返回false 这就是我在控制器中所做的: MyLoginController.phpLaravel:使用自定义保护/尝试方法在成功登录时设置cookie,laravel,cookies,laravel-6,Laravel,Cookies,Laravel 6,我正在使用第三方数据库进行身份验证。一切都很好,但现在希望在用户登录时设置cookie 如合同所述: 如果身份验证成功,则尝试方法将返回true。否则,将返回false 这就是我在控制器中所做的: MyLoginController.php $user = Auth::guard('foo')->attempt(['userid' => $request->username, 'password' => $request->password], $request-&
$user = Auth::guard('foo')->attempt(['userid' => $request->username, 'password' => $request->password], $request->remember);
dd($user);
...
return redirect()->intended(route('home'));
$user = Auth::guard('foo')->attempt(['userid' => $request->username, 'password' => $request->password], $request->remember);
if ($user) {
switch (App::environment()) {
case 'local':
$cookie = cookie('localCookieName', $user->token, 480);
break;
case 'development':
$cookie = cookie('devCookieName', $user->token, 480);
break;
case 'production':
$cookie = cookie('cookieName', $user->token, 480);
break;
default:
//
break;
}
return redirect()->intended(route('home'))->cookie($cookie);
}
return redirect()->intended(route('home'));
这里的一切都很棒。我得到了预期的true
或false
我想做的是,如果登录成功,在响应上设置一个cookie。我需要用户对象返回以从中获取值。大概是这样的:
MyLoginController.php
$user = Auth::guard('foo')->attempt(['userid' => $request->username, 'password' => $request->password], $request->remember);
dd($user);
...
return redirect()->intended(route('home'));
$user = Auth::guard('foo')->attempt(['userid' => $request->username, 'password' => $request->password], $request->remember);
if ($user) {
switch (App::environment()) {
case 'local':
$cookie = cookie('localCookieName', $user->token, 480);
break;
case 'development':
$cookie = cookie('devCookieName', $user->token, 480);
break;
case 'production':
$cookie = cookie('cookieName', $user->token, 480);
break;
default:
//
break;
}
return redirect()->intended(route('home'))->cookie($cookie);
}
return redirect()->intended(route('home'));
我正在使用一个自定义的用户提供者来验证我的用户-那里的一切都很好。我正在获取用户,并在需要时将任何数据保存到本地数据库。我想我可以在UserProvider中设置cookie,但是不做->cookie($cookie)
任何设置都没有
$user->token
的值正在从我的第三方身份验证返回。这就是为什么我需要能够访问该值
,看起来我需要在响应->cookie($cookie)
或with cookies($cookies)
上设置cookie
这让我相信我需要在我的控制器上设置cookie,但我不确定如何取回用户对象,因为尝试
方法只返回真
或假
如何从尝试
方法中获取用户对象?也许我让事情变得难以置信的困难,有一个更简单的方法来设置饼干
谢谢你的建议
编辑
这是我的config/auth.php
文件:
...
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
'foo' => [
'driver' => 'session',
'provider' => 'foo',
],
],
...
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'foo' => [
'driver' => 'foo', // Using a 3rd party for auth.
'model' => App\MyUser::class, // User model for auth.
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
尝试
如果用户的凭据有效且正确,则进行登录。因此,您可以从请求或Auth guard获取用户,因为他们已登录:
$user = $request->user();
$user = $request->auth('foo')->user();
$user = Auth::guard('foo')->user();
...
如果您知道trunt
已通过,用户还可以通过会话保护上的getlasttrunt
访问:
$user = Auth::guard('foo')->getLastAttempted();
虽然您可以使用,但我不会,因为在信任此值之前,您必须检查trunt
是否实际返回true。这将保存凭据检索到的最后一个用户,该用户可能未通过身份验证,trunt
返回false
您不必直接向响应中添加cookie。在文档的Cookie部分中,应包含有关自动将Cookie附加到传出响应的“队列”信息:
Cookie::queue('name', 'value', $minutes);
为什么要进行内部尝试?你还在使用会话保护吗?我已经更新了我的问题以显示我的
config/auth.php
文件。我仍在使用会话保护是的。您要附加的cookie在做什么?@lagbox这有点棘手-第三方身份验证需要(相当于)会话令牌-这是传递回它的cookie的值,以便稍后获取更多信息。不知道,但这正是我必须处理的问题。:)这是有效的——利用“queable”方法是我唯一没有尝试的事情(如图所示)。我还发现使用普通的'olphpsetcookie
是有效的。我试着尽可能多地使用“拉威尔方式”。谢谢你的洞察力!请记住,laravel会加密cookies,所以如果您需要在laravel之外阅读它,这可能是一个问题