在Laravel 5中跨子域持久化会话

sycxhyv7  于 2022-12-05  发布在  其他
关注(0)|答案(7)|浏览(119)

使用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(),
                ]);
}
5uzkadbs

5uzkadbs1#

找到了。更新session.php中的domain => '.example.com'并清除有问题的站点的cookie。

ejk8hzay

ejk8hzay2#

@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。

yqyhoc1h

yqyhoc1h3#

您需要更新会话配置以在域范围内(包括子域)保持会话。请按照以下步骤操作。
1.转至**config/session.php,并将前缀为.domain更新为config => '.your-domain.com'
1.然后清除您的应用程序缓存,打开Chrome DevTool并转到
应用程序〉应用程序〉清除存储**。您还需要清除之前的cookie
1.运行Artisan命令**php artisan config:cachephp artisan config:clear以删除以前缓存laravel应用程序配置。
如果使用
database作为会话驱动程序,则需要为此创建会话表。运行命令php artisan session:table以生成会话表移植,然后使用php artisan migrate**进行移植。然后执行上面给出的三个步骤。

lzfw57am

lzfw57am4#

使用Laravel 8,操作更加简单:
SESSION_DOMAIN添加到 .env 文件中:

SESSION_DOMAIN=.yourdomain.tld

清除配置缓存:

php artisan config:cache

删除您的浏览器会话cookie,然后会话成为共享之间的所有子域。
在我的情况下,我曾经自动登录用户到子域一旦帐户是在www.domain上创建的。工作得很好。

lg40wkob

lg40wkob5#

您是否尝试过将会话存储在数据库、memcached或redis中而不是文件中?我的情况与您类似,将会话存储在数据库中为我解决了这个问题。
由于某种原因,在使用文件驱动程序时,Laravel的会话驱动程序不能正确处理跨域会话。

z31licg0

z31licg06#

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

cbeh67ev

cbeh67ev7#

如果某人需要同步子域中的会话,不同的laravel应用程序共享同一数据库
按照@Kiran Maniya的所有说明进行操作然后您必须保持相同的应用程序名称以获得相同的会话名称。或者只是更改config/session.php中的cookie配置
如果无法保持相同名称,则可以对其进行硬编码。

'cookie' => env(
    'SESSION_COOKIE',
    Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
)

转换为类似以下的内容:

'cookie' => env(
    'SESSION_COOKIE',
    'session_sharing_application_session'
)

相关问题