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

时间:2015-05-20 00:56:36

标签: laravel laravel-5

使用5.0

在config / session.php中的

我已设置'domain' => '.example.com'但它无效。我不能在这样的一个域上坚持会议。

我的网站有很多子域名:

vancouver.example.com
newyork.example.com

等...它们托管在同一台服务器上,并且是相同的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(),
                ]);
}

6 个答案:

答案 0 :(得分:38)

想出来。更新session.php中的domain => '.example.com'并清除相关网站的Cookie。

答案 1 :(得分:13)

@gadss

你需要像这样添加会话表

php artisan session:table

composer dump-autoload

php artisan migrate

并将.env更改为 SESSION_DRIVER=database

还修改config / session.php

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

'domain' => '.yourdomain.com'

之后清除浏览器的缓存和Cookie。

答案 2 :(得分:3)

您是否尝试将会话存储在数据库,memcached或redis中而不是存储在文件中?我遇到了类似的情况,在数据库中存储会话为我解决了问题。

由于某些原因,Laravel的会话驱动程序在使用文件驱动程序时无法正确处理跨域会话。

答案 3 :(得分:2)

使用 Laravel 8,它变得更加简单:

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

SESSION_DOMAIN=.yourdomain.tld

清除配置缓存:

php artisan config:cache

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

在我的情况下,一旦在 www 上创建帐户,我曾经自动登录用户到子域。领域。工作正常。

答案 4 :(得分:1)

如果仍然有人遇到子域Cookie的问题。尝试在config / session.php中更改会话Cookie名称

答案 5 :(得分:0)

您需要更新会话配置,以将会话保留在整个域(包括子域)中。请按照以下步骤操作。

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

  2. 然后清除您的应用程序缓存,打开Chrome DevTool并转到应用程序>应用程序>清除存储空间。您还需要清除以前的 cookies

  3. 运行工匠命令 php artisan config:cache php artisan config:clear 删除先前缓存的laravel应用程序配置。

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