在Laravel 5中坚持跨子域的会话

Ant*_*ond 32 laravel laravel-5

使用5.0

在config/session.php我已设置'domain' => '.example.com'但它无法正常工作.我不能在这样的一个域上坚持会话.

我的网站有很多子域名:

vancouver.example.com
newyork.example.com
Run Code Online (Sandbox Code Playgroud)

等...它们托管在同一台服务器上,并且是相同的Laravel应用程序(共享相同的存储目录)

我使用正确的凭据登录,应用程序重定向到该网站上的另一个页面,此时我没有会话.var_dump(Auth::user())显示null即使我使用正确的凭据登录.

storage/framework/sessions 在那里显示了14个不同的文件,它们都适合我,在我开始测试之前我将它们清除了.

我将在下面附加我的AuthController @ postLogin方法,如果session.php可以正常工作 'domain' => null

public function postLogin(Request $request)
{
    $this->validate($request, [
        'email' => 'required|email', 'password' => 'required',
    ]);

    $credentials = $request->only('email', 'password');

    if ($this->auth->attempt($credentials, $request->has('remember')))     {
        Session::flash('message', 'You are now logged in.');
        Session::flash('status', 'success');

        if (str_contains($_SERVER['HTTP_REFERER'], '?goto=')) {
            $params = explode('?', $_SERVER['HTTP_REFERER'])[1];
            $target = explode('=', $params)[1];
        } else {
            $target = '/';
        }

        return redirect($target);
    }

    return redirect($this->loginPath())
                ->withInput($request->only('email', 'remember'))
                ->withErrors([
                    'email' => $this->getFailedLoginMessage(),
                ]);
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ond 45

弄清楚了.domain => '.example.com'在session.php中更新并清除相关网站的Cookie.

  • 注意:如果您在尝试不成功后执行此解决方案,请不要忘记删除所有子域上的所有现有Cookie. (4认同)
  • 在Laravel 5.4中,现在可以使用.SESSION_DOMAIN在.env文件中进行配置。 (2认同)

eng*_*qas 13

@gadss

你需要像这样添加会话表

php artisan session:table

composer dump-autoload

php artisan migrate
Run Code Online (Sandbox Code Playgroud)

并将.env改为 SESSION_DRIVER=database

还修改config/session.php

'driver' => env('SESSION_DRIVER', 'database')

'domain' => '.yourdomain.com'
Run Code Online (Sandbox Code Playgroud)

之后清除浏览器的缓存和cookie.


Kir*_*iya 10

您需要更新会话配置以在域范围内(包括子域)中保留会话。按照下面给出的步骤操作。

  1. 转到config/session.php并更新domain前缀.config => '.your-domain.com'

  2. 然后清除您的应用程序缓存,打开 Chrome DevTool 并转到Application > Application > Clear Storage。您还需要清除以前的cookie

  3. 运行 artisan 命令php artisan config:cachephp artisan config:clear删除以前缓存的 Laravel 应用程序配置。

如果您使用数据库作为会话驱动程序,您需要为此创建一个会话表。运行命令php artisan session:table生成会话表迁移,然后使用php artisan migrate. 然后执行上面给出的三个步骤。


Red*_*han 9

使用 Laravel 8 变得更加简单:

将SESSION_DOMAIN添加到您的.env文件中:

SESSION_DOMAIN=.yourdomain.tld
Run Code Online (Sandbox Code Playgroud)

清除配置缓存:

php artisan config:cache
Run Code Online (Sandbox Code Playgroud)

删除您的浏览器会话 cookie,然后会话将在您的所有子域之间共享。

就我而言,一旦在 www 上创建帐户,我就会自动登录用户到子域。领域。工作得很好。