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']), ]);
// 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'); });
class User extends Authenticatable implements MustVerifyEmail { use Notifiable; use psCMS\Presenters\UserPresenter; public http://www.php.net/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(http://www.php.net/array $roles) { foreach($roles as $role) { if(http://www.php.net/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; } }
Pomijając fakt że masz kupę zbędnych kolumn w bazie....
https://laravel.com/docs/5.8/middleware#middleware-parameters
Chyba coś nie do końca mi działa
Dodałem nową klasę:
CheckRole
use App\Role; use Closure; class CheckRole { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next, $role) { if (! $request->user()->hasRole($role)) { return redirect()->route('home'); } return $next($request); } }
// 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('role:user,role:userPremium'); }); // użytkownicy zalogowani posiadający rolę: admin Route::group(['prefix' => 'cms', 'middleware' => 'auth'], function () { Route::get('/', 'CMSController@cms')->name('index')->middleware('role:admin'); });
https://laravel.com/docs/5.8/middleware#registering-middleware
Czytaj dokumentację.
Co do tabeli to masz 3 zestawy tych samych danych więc powinna to być oddzielna tabela i złączona relacją 1:n
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)