Dostępy do podstron w Laravel 5.8 po zalogowaniu

0

Witam serdecznie.
Od paru dni uczę się Laravel i natrafiłem na następujący problem.
W swojej aplikacji chciałbym mieć 3 poziomy dostępu:

  1. użytkownik niezalogowany
  2. użytkownik zalogowany (rola: user i userPremium)
  3. użytkownik administrator (rola: admin)

W swoim projekcie wykorzystuję wbudowane w Laravel funkcje rejestracji i logowania.

Mam następujące migracje:


Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('company_id')->unsigned();
            $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
            $table->boolean('enable')->default(0);
            $table->string('name', 120)->nullable();
            $table->string('surname', 120)->nullable();
            $table->string('email', 120)->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->bigInteger('counter')->default(0);
            $table->string('url_address', 160);
            $table->boolean('isCompany')->default(0);
            $table->boolean('isMailing')->default(0);
            $table->text('content')->nullable();
            $table->string('nip1', 12)->nullable();
            $table->string('business1', 120)->nullable();
            $table->string('phone1', 60)->nullable();
            $table->string('street1', 150)->nullable();
            $table->string('number1', 8)->nullable();
            $table->string('postal_code1', 12)->nullable();
            $table->string('city1', 100)->nullable();
            $table->bigInteger('country_id1')->default(0);
            $table->bigInteger('provincial_id1')->default(0);
            $table->string('nip2', 12)->nullable();
            $table->string('business2', 120)->nullable();
            $table->string('phone2', 60)->nullable();
            $table->string('street2', 150)->nullable();
            $table->string('number2', 8)->nullable();
            $table->string('postal_code2', 12)->nullable();
            $table->string('city2', 100)->nullable();
            $table->bigInteger('country_id2')->default(0);
            $table->bigInteger('provincial_id2')->default(0);
            $table->string('nip3', 12)->nullable();
            $table->string('business3', 120)->nullable();
            $table->string('phone3', 60)->nullable();
            $table->string('street3', 150)->nullable();
            $table->string('number3', 8)->nullable();
            $table->string('postal_code3', 12)->nullable();
            $table->string('city3', 100)->nullable();
            $table->bigInteger('country_id3')->default(0);
            $table->bigInteger('provincial_id3')->default(0);
            $table->decimal('cash', 9, 2)->default(0);
            $table->decimal('lng', 10, 8)->default(0);
            $table->decimal('lat', 10, 8)->default(0);
            $table->boolean('enable_map')->default(0);
            $table->rememberToken();
            $table->timestamps();
            $table->engine = "InnoDB";
        });
        
        Schema::create('roles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->engine = "InnoDB";
        });
        
        Schema::create('role_user', function (Blueprint $table) {
            $table->bigInteger('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->bigInteger('role_id')->unsigned();
            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
            $table->engine = "InnoDB";
        });
        
        
        DB::table('roles')->insert([
                'name' => $faker->unique()->randomElement(['admin', 'user', 'userPremium']),
            ]);
        

Mój router wygląda następująco (web.php):


// użytkownicy niezalogowani       
Route::get('/', 'FrontendController@index')->name('home');

// użytkownicy zalogowani posiadający rolę: user i userPremium
Route::group(['prefix' => 'panel', 'middleware' => 'auth'], function () {
    Route::get('/', 'BackendController@index')->name('adminHome')->middleware('verified');
});

// użytkownicy zalogowani posiadający rolę: admin
Route::group(['prefix' => 'cms', 'middleware' => 'auth'], function () {
    Route::get('/', 'CMSController@cms')->name('index')->middleware('verified');
});  
       

Model User.php wygląda następująco:


class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;
    use psCMS\Presenters\UserPresenter;

    public static $roles = [];

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */

    protected $fillable = ['company_id', 'enable', 'name', 'surname', 'email', 'email_verified_at', 'password', 'counter', 'url_address',  'isCompany', 'isMailing', 'content', 'nip1', 'business1', 'phone1', 'street1', 'number1', 'postal_code1', 'city1', 'country_id1', 'provincial_id1', 'nip2', 'business2', 'phone2', 'street2', 'number2', 'postal_code2', 'city2', 'country_id2', 'provincial_id2', 'nip3', 'business3', 'phone3', 'street3', 'number3', 'postal_code3', 'city3', 'country_id3', 'provincial_id3', 'cash', 'lng', 'lat', 'enable_map', 'remember_token', 'created_at', 'updated_at', 'last_login_at', 'last_login_ip' ];


    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];


    public function photos()
    {
        return $this->morphMany('App\Photo', 'photoable');
    }


    public function roles()
    {
        return $this->belongsToMany('App\Role');
    }


    public function hasRole(array $roles)
    {

        foreach($roles as $role)
        {

            if(isset(self::$roles[$role]))
            {
                if(self::$roles[$role])  return true;

            }
            else
            {
                self::$roles[$role] = $this->roles()->where('name', $role)->exists();
                if(self::$roles[$role]) return true;
            }

        }


        return false;

    }

}

W jaki sposób mogę to zrobić?

  1. Użytkownik niezalogowany nie może wejść zarówno do route panel oraz admin
  2. Użytkownik zalogowany jako user lub userPremium może wejść tylko do route panel - nie może wejść do route admin
  3. Użytkownik zalogowany jako user admin może wejść tylko do route admin - nie może wejść do route panel

W jaki sposób to zrobić?

1

Najwygodniej będzie Ci stworzyć osobny middleware zawierający Twoją logikę uwierzytelniania (abstrahując od wbudowanego laravelowego auth), który będzie miał dostęp do danych użytkownika i będzie mógł sprawdzać poziomy dostępu.

Lektura: https://laravel.com/docs/5.8/middleware

1
Patryk27 napisał(a):

Najwygodniej będzie Ci stworzyć osobny middleware zawierający Twoją logikę uwierzytelniania (abstrahując od wbudowanego laravelowego auth), który będzie miał dostęp do danych użytkownika i będzie mógł sprawdzać poziomy dostępu.

Lektura: https://laravel.com/docs/5.8/middleware

Czy mógłbym Cie prosić o przykład? Tak daleko jeszcze nie ogarniam :(

1

no poczytaj tego linka co dostałeś, tam jest bardzo łopatologicznie napisane jak się tworzy middlewary.

0

Wklep w google: Multiple Authentication System Laravel i masz naprawdę sporo towaru do przejrzenia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1