【问题标题】:How i can split two users in laravel?我如何在 laravel 中拆分两个用户?
【发布时间】:2019-11-11 19:47:49
【问题描述】:

我已经尝试了很多方法,但不是我无法正确执行路线和重定向。我想要这样,如果管理员进来,他们会重定向到仪表板,如果这只是一个用户,那么就回家。我没有关于如何做到这一点的想法。请帮帮我

role_user_table

public function up()
    {
        Schema::create('role_user', function (Blueprint $table) {
            $table->integer('role_id');
            $table->integer('user_id');

            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

            $table->primary(['user_id', 'role_id']);
        });
    }

角色表 1. 管理员 2.注册用户

public function up()
    {
        Schema::create('roles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
        });
    }

用户表

Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->tinyInteger('role_id')->unsigned()->nullable();
            $table->string('name');
            $table->string('email');
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();

            $table->foreign('role_id')->references('id')->on('roles');
        });

中间件

 namespace App\Http\Middleware;

 use Closure;

  class CheckIfAdmin{
  public function handle($request, Closure $next)
  {
    $user = $request->user();

    if (!isset($user)) {
        return redirect('admin/login');
    }

    if (!$user->isAdmin()) {
        return redirect('/');
    }

    return $next($request);
}

}

内核.php

protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'admin' => \App\Http\Middleware\CheckIfAdmin::class,
    ];

角色.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    protected $fillable = ['name'];

    public $timestamps = false;

    public function users()
    {
        return $this->hasMany(User::class);
    }
}

用户.php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use App\Role;

class User extends Authenticatable
{
    use Notifiable;

    protected $fillable = [
        'name', 'email', 'password',
    ];


    protected $hidden = [
        'password', 'remember_token',
    ];

    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }

    public function isAdmin()
    {
        return (boolean)$this->roles->where('name', 'admin')->count();
    }
}

web.php

      Route::group(['prefix'=>'admin', 'namespace'=>'Admin', 'middleware'=> 
   ['auth']], function(){

      Route::resource('/category', 'CategoryController', ['as'=>'admin']);
      Route::resource('/article', 'ArticleController', ['as'=>'admin']);
      Route::group(['prefix' => 'user_managment', 'namespace' => 
   'UserManagment'], function() {
      Route::resource('/user', 'UserController', ['as' => 
    'admin.user_managment']);
      });
    Route::group(['middleware' => 'admin'], function() {
        Route::get('/', 'DashboardController@dashboard')- 
   >name('admin.index');
    });
    });
    Route::get('/', function () {
        return view('blog.home');
    });

    Auth::routes();

    Route::get('/home', 'HomeController@index')->name('home');

现在他去 admin 如果 admin 注册在 url admin 行,如果一个简单的用户这样做,他不会错过它,但我需要他自动扔到仪表板上。仪表板位于 admin 文件夹中

【问题讨论】:

  • 我没有看到在您的路由或控制器中使用了 admin 中间件。它在哪里使用?
  • 如果你使用pivot,为什么用户有一个role_id字段,为什么角色与用户的关系不使用pivot?
  • @NMahurin 所以我不知道如何进行检查并正确登录管理员。我需要在管理员中显示所有内容,并且对于一个简单的用户来说只有主页

标签: php laravel


【解决方案1】:

由于您已经编写了大部分代码,这应该可以工作:

Route::group(['prefix'=>'admin', 'namespace'=>'Admin', 'middleware'=>['admin']], function(){
  Route::get('/', 'DashboardController@dashboard')->name('admin.index');
  Route::resource('/category', 'CategoryController', ['as'=>'admin']);
  Route::resource('/article', 'ArticleController', ['as'=>'admin']);
  Route::group(['prefix' => 'user_managment', 'namespace' => 'UserManagment'], function() {
  Route::resource('/user', 'UserController', ['as' => 'admin.user_managment']);
  });
});


Route::get('/', function () {
    return view('blog.home');
}); // Not sure if you want this behind the middleware or not

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

我会在你的中间件中更改这一行:

if (!$user->isAdmin()) {
    return redirect('/home');
}

以便根据您的评论将非管理员使用重定向到/home。这里不需要使用Auth 和admin 中间件,因为admin 将处理非管理员用户。它应该允许所有管理员访问包裹在 admin 中间件内的组,并将非管理员重定向到 /home 路由。让我知道这是否是您正在寻找的,或者我是否可以为您改进。

对于重定向问题:

签出:https://codeburst.io/learn-how-to-redirect-authenticated-users-to-corresponding-path-in-laravel-dd613e2f9e3 您可以将protected $redirectTo = 'admin'; 更改为函数:public function redirectTo(){}。它最终会像:

public function redirectTo(){

    // User role
    $role = Auth::user()->role->pluck('name')->toArray(); 

    if(in_array('admin', $role)){
        return '/admin/login';
    }else{
        return '/home';
    }
}

【讨论】:

  • 我更新了问题,请看。使用您的方法,当我退出面板时,不会立即找到该页面。在我添加的我的中,一切都很好,但需要立即将其扔到仪表板上。 Blade.php 仪表板位于 admin 文件夹中
  • 我不确定您的意思@NikitaKurilovic 当您退出面板时,找不到哪个页面?你能展示你的身份验证控制器吗?
  • 使用你的代码,点击用户出口,我被抛出了对不起这个页面没有找到
  • @NikitaKurilovic 注销方法不在任何中间件后面。我猜你的注销方法指向'/',这就是评论的目的。只需删除Route::get('/', function().... 部分的->middleware('admin') 部分。查看编辑。
  • 成功了。现在是最后一个。如果是管理员,则为仪表板,如果为简单用户,则为主页。我把 COntroller 放在 Login ``` protected $redirectTo = 'admin';``` 中,但这是为所有人准备的,但我只需要管理员
猜你喜欢
  • 2019-08-21
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多