محمد
4 سال پیش توسط محمد مطرح شد
4 پاسخ

نشست ها در چندین guard لاراول

سلام دوستان این موضوع قبلا مطرح کردم چون پاسخی دریافت نکردم گفتم شاید بهتر دوباره مطرح کنم :
من در پروژه لاراولی از چندین guard استفاده کردم و حالا میخوام session لاراول رو از پیشفرض file به database تغییر بدم و جدول session در لاراول یه مقدار داره به عنوان user_id اگه من با guard ادمین با id ۱ لاگین کنم user_id میشه ۱ و اگه با guard یوزر با id ۱ لاگین کنم user_id میشه ۱ چطوری اینا رو باید از هم جدا کنم؟

@ali.bayat
@hesammousavi
@mohaligateway
@mhyeganeh


ثبت پرسش جدید
محمد
تخصص : php , laravel , react
@imamaad 4 سال پیش مطرح شد
1

@mohaligateway
سپاس از راهنماییتون همین روش استفاده کردم تقریبا جواب داد.
چون نقش و تعداد ستون ها خیلی متفاوت هست نمیتونم از permission استفاده کنم مثلا پیک و فروشنده و ...
حالا به صورت کامل کاری که کردم اینجا مینویسم شاید یکی دیگم به این مشکل برخورد کنه:
۱- تغییر جدول session :

 Schema::create('sessions', function (Blueprint $table) {
            $table->string('id')->primary();
            $table->nullableMorphs('user');
            $table->string('ip_address', 45)->nullable();
            $table->text('user_agent')->nullable();
            $table->text('payload');
            $table->integer('last_activity')->index();
        });

*نکته : مقدار nullableMorphs دوتا سلول برای ما ایجاد میکنه user_id و user_type
۲-در فودر App\Exceptions یه فایل با نام DatabaseSessionHandler ایجاد میکنیم که extends شده از DatabaseSessionHandler i هسته لاراول کد :

<?php

namespace App\Exceptions;

use Illuminate\Contracts\Auth\Guard;
use Illuminate\Session\DatabaseSessionHandler as BaseDatabaseSessionHandler;

class DatabaseSessionHandler extends BaseDatabaseSessionHandler
{

    /**
     * Get the currently authenticated user's type.
     *
     * @return mixed
     */
    protected function userType()
    {
        $user = $this->container->make(Guard::class)->user();
        return optional($user)->getMorphClass();
    }

    /**
     * Add the user information to the session payload.
     *
     * @param array $payload
     * @return $this
     */
    protected function addUserInformation(&$payload)
    {
        if ($this->container->bound(Guard::class)) {
            $payload['user_id'] = $this->userId();
            $payload['user_type'] = $this->userType();
        }

        return $this;
    }
}

3- کد زیر را در متد boot فایل AppServiceProvider بنویسید یا یک Provider با نام SessionProvider ایجاد کنید و آنرا در config.php اتفاده کنید کد :

$this->app['session']->extend('database', function($app){
            $connection   = Config::get('session.connection');
            $table   = Config::get('session.table');
            $minutes = Config::get('session.lifetime');
            return new DatabaseSessionHandler(
                $this->app['db']->connection($connection),
                $table,
                $minutes,
                $app
            );
        });

حالا به راحتی میتونید با قرار دادن متد زیر در model های خود از سشن های اون کاربر استفاده کنید :

public function sessions()
    {
        return $this->morphMany(Session::class, 'user');
    }

moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 4 سال پیش مطرح شد
0

سلام دوست عزیز
اگه امکانش هست یه کم بیشتر توضیح بدید. user_id باید یکتا باشه! نام کاربری هاتون به چه شکلی هست ؟
@imamaad


محمد
تخصص : php , laravel , react
@imamaad 4 سال پیش مطرح شد
0

@mohaligateway
سلام وقت بخیر.
در لاراول پیشفرض یه جدول session داره که نشست های کاربر درونش ذخیره میکنه.
این جدول :

Schema::create('sessions', function (Blueprint $table) {
            $table->string('id')->primary();
            $table->foreignId('user_id')->index()->nullable()->references('id')->on('users');
            $table->string('ip_address', 45)->nullable();
            $table->text('user_agent')->nullable();
            $table->text('payload');
            $table->integer('last_activity')->index();
        });

حالا من چون دارم از چندین guard استفاده میکنم به شکل زیر :

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],

        'admin'=>[
            'driver' => 'session',
            'provider' => 'admins'
        ],
        'delivery'=>[
            'driver' => 'session',
            'provider'=>'deliveries',
        ],
        'supplier'=>[
            'driver'=>'session',
            'provider'=>'suppliers',
        ],
    ],

الان اینجوریه که مقدار user_id که در جدول session ثبت میشه هم میتونه id جدول user و هم id جدول supplier و ... باشه و اینجوری یه سشن برای دوکاربر با id یکسان که در جداول متفاوت قرار دارن ثبت میشه و مشکل اینه


moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 4 سال پیش مطرح شد
1

بهتره که برای اینگه موارد از Role و Permission استفاده کنی. اگه امکانش رو داری. اکثرا الان پروژه ها به این شکل اجرا میشن. اما اگر می خوای از روش guard استفاده کنی در کنار user_id یک ستون اضافه کن برای ثبت مدلی که session از اون میاد. مثلا App\Admin و ... و داخل middleware و یا هرجائی که می خواهی چک کنی می تونی از با استفاده از این ستون تفاوت ایجاد منی.
@imamaad


محمد
تخصص : php , laravel , react
@imamaad 4 سال پیش مطرح شد
1

@mohaligateway
سپاس از راهنماییتون همین روش استفاده کردم تقریبا جواب داد.
چون نقش و تعداد ستون ها خیلی متفاوت هست نمیتونم از permission استفاده کنم مثلا پیک و فروشنده و ...
حالا به صورت کامل کاری که کردم اینجا مینویسم شاید یکی دیگم به این مشکل برخورد کنه:
۱- تغییر جدول session :

 Schema::create('sessions', function (Blueprint $table) {
            $table->string('id')->primary();
            $table->nullableMorphs('user');
            $table->string('ip_address', 45)->nullable();
            $table->text('user_agent')->nullable();
            $table->text('payload');
            $table->integer('last_activity')->index();
        });

*نکته : مقدار nullableMorphs دوتا سلول برای ما ایجاد میکنه user_id و user_type
۲-در فودر App\Exceptions یه فایل با نام DatabaseSessionHandler ایجاد میکنیم که extends شده از DatabaseSessionHandler i هسته لاراول کد :

<?php

namespace App\Exceptions;

use Illuminate\Contracts\Auth\Guard;
use Illuminate\Session\DatabaseSessionHandler as BaseDatabaseSessionHandler;

class DatabaseSessionHandler extends BaseDatabaseSessionHandler
{

    /**
     * Get the currently authenticated user's type.
     *
     * @return mixed
     */
    protected function userType()
    {
        $user = $this->container->make(Guard::class)->user();
        return optional($user)->getMorphClass();
    }

    /**
     * Add the user information to the session payload.
     *
     * @param array $payload
     * @return $this
     */
    protected function addUserInformation(&$payload)
    {
        if ($this->container->bound(Guard::class)) {
            $payload['user_id'] = $this->userId();
            $payload['user_type'] = $this->userType();
        }

        return $this;
    }
}

3- کد زیر را در متد boot فایل AppServiceProvider بنویسید یا یک Provider با نام SessionProvider ایجاد کنید و آنرا در config.php اتفاده کنید کد :

$this->app['session']->extend('database', function($app){
            $connection   = Config::get('session.connection');
            $table   = Config::get('session.table');
            $minutes = Config::get('session.lifetime');
            return new DatabaseSessionHandler(
                $this->app['db']->connection($connection),
                $table,
                $minutes,
                $app
            );
        });

حالا به راحتی میتونید با قرار دادن متد زیر در model های خود از سشن های اون کاربر استفاده کنید :

public function sessions()
    {
        return $this->morphMany(Session::class, 'user');
    }

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام