当前位置: 首页 > 知识库问答 >
问题:

Laravel-无法获取管理员守卫的角色

岑畅
2023-03-14

我有一个前端和管理区域。前端使用Laravel的Auth包,对于Admin我使用的是adminGuard,所有视图、控制器和模型都在admin目录下。

我正在尝试使用相同的角色和权限模型为前端和管理员用户设置角色和权限。为此,我创建了以下表格

  • 管理员

问题是:我可以使用belongtomany()为前端用户获取角色,但不能为管理员获取角色。这是代码。

namespace App;

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

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

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

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function admin_roles()
    {
        return $this->belongsToMany('App\Admin\Role', 'role_admin');
    }

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

use Illuminate\Database\Eloquent\Model;

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

    public function permissions()
    {
        return $this->belongsToMany('App\Admin\Permission');
    }

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

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

}
{{auth()->user()->roles}}

// output 
[{"id":1,"name":"admin","display":"Admin","created_at":null,"updated_at":null,"pivot":{"user_id":1,"role_id":1}},{"id":2,"name":"supervisor","display":"Supervisor","created_at":null,"updated_at":null,"pivot":{"user_id":1,"role_id":2}}]
{{auth()->user()->admin_roles}}
//output
null - checked with dd()
Schema::create('role_admin', function (Blueprint $table) {
    $table->bigInteger('role_id')->unsigned();
    $table->bigInteger('admin_id')->unsigned();
    $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
    $table->foreign('admin_id')->references('id')->on('admins')->onDelete('cascade');
});
Schema::create('role_user', function (Blueprint $table) {
    $table->bigInteger('role_id')->unsigned();
    $table->bigInteger('user_id')->unsigned();
    $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
Schema::create('roles', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');
    $table->text('display');
    $table->timestamps();
});
Schema::create('permissions', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('model');
    $table->string('can');
    $table->timestamps();
});
Schema::create('permission_role', function (Blueprint $table) {
    $table->bigInteger('permission_id')->unsigned();
    $table->bigInteger('role_id')->unsigned();

    $table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');
    $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
});
Schema::create('admins', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});
 <?php

namespace App\Admin;

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

class Admin extends Authenticatable
{
    use Notifiable;

    protected $guard = 'admin';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

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

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function sendPasswordResetNotification($token)
    {
        $this->notify(new ResetPasswordNotification($token));
    }
}

我已将角色管理的关系设置为管理模型,该模型之前被错误地放置在用户模型中。

<?php

namespace App\Admin;

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

class Admin extends Authenticatable
{
    use Notifiable;

    protected $guard = 'admin';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

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

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function sendPasswordResetNotification($token)
    {
        $this->notify(new ResetPasswordNotification($token));
    }

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

共有2个答案

衡泰
2023-03-14

问题是您使用的是模型用户,而不是管理员

要恢复,请执行以下操作:

  1. 从用户模型中删除管理员角色关系,并将其置于管理员模型中
王骏
2023-03-14

看起来你的admin_roles关系在你的用户模型中,但是在你的迁移中,你已经声明了管理员表的外键。像这个

$table->foreign('admin_id')->references('id')->on('admins')->onDelete('cascade');

现在,假设您以管理员身份登录,那么您的管理员模型也应该具有这种关系。

public function admin_roles()
{
    return $this->belongsToMany('App\Admin\Role', 'role_admin', 'admin_id', 'role_id');
}
 类似资料:
  • Guard允许您使用简单优雅的代码写出断言代码。守卫是可拓展的。 实用函数 That 通过That可以获取守卫实例,这样您可以使用扩展函数为守卫进行扩展。 var guard = Guard.That; Requires 验证条件并在条件失败时抛出异常。 Guard.Requres<ArgumentNullException>(arg != null, $"Argument {nameof(ar

  • 我正在使用Azure AD和Office 365 API在我的项目中执行OAuth。我的问题是我只能授权管理员帐户(如“user@project.onmicrosoft.com”)并获取数据,但非管理员常规帐户(如“user@hotmail.com”)不能。 我如何实现OAuth2 获取授权代码: https://login.microsoftonline.com/common/oauth2/au

  • 本文向大家介绍vue2.0 实现导航守卫的具体用法(路由守卫),包括了vue2.0 实现导航守卫的具体用法(路由守卫)的使用技巧和注意事项,需要的朋友参考一下 路由跳转前做一些验证,比如登录验证,是网站中的普遍需求。 对此,vue-route 提供的 beforeRouteUpdate 可以方便地实现导航守卫(navigation-guards)。 导航守卫(navigation-guards)这

  • 正在尝试设置引导管理服务器。与客户端实例的连接在,即使所有相关endpoint都可访问(并且spring security不在类路径中) 在服务器启动时,我得到: 管理员pom。xml 管理应用程序。yml每管理员文档 客户application.yml 管理服务器日志中有错误

  • 本文向大家介绍vue2.0 实现导航守卫(路由守卫),包括了vue2.0 实现导航守卫(路由守卫)的使用技巧和注意事项,需要的朋友参考一下 路由跳转前做一些验证,比如登录验证,是网站中的普遍需求。 对此,vue-route 提供的 beforeRouteUpdate 可以方便地实现导航守卫(navigation-guards)。 导航守卫(navigation-guards)这个名字,听起来怪怪的

  • 本文向大家介绍vue路由守卫+登录态管理实例分析,包括了vue路由守卫+登录态管理实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了vue路由守卫+登录态管理。分享给大家供大家参考,具体如下: 在路由文件需要守卫的path后面加上meta 在main.js里面加上 其中islogin是登录态,就是true or false,true表示登录,false表示未登录,存放在localSt