如何在 Laravel 5 中建立用户和角色关系

2024-02-19

我有两张桌子:

User ->
  id : 
  name : 
  role_id : ->references('id')->on('roles');

Roles ->
  id :
  role_name :
  access :

我正在尝试从用户访问角色详细信息。

我的用户模型有:

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

我的榜样有:

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

当我尝试执行以下操作时:

$user = User::find(1);

$details = [
    'name' => $user->first_name,
    'role' => $user->role->role_name
];

我收到错误:

试图获取非对象的属性

我的角色表包含​​访问列,其中包含不同路由的权限数组。所以我的用户将只有一个角色。而一个角色可以有多个用户。

怎么做?


在我最近的项目中,我以这种方式处理了这些需求。 首先数据库表结构/迁移

用户表

class CreateUserTable extends Migration {

    public function up() {
        Schema::create('user', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password', 60);
            $table->boolean('status')->default(0);
            $table->boolean('is_admin')->default(0);
            $table->boolean('notify')->default(0);
            $table->rememberToken();
            $table->timestamps();
        });
    }

    public function down() {
        Schema::drop('user');
    }

}

角色表

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateRoleTable extends Migration {
    public function up()
    {
        Schema::create('role', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name')->unique();
            $table->string('display_name')->nullable();
            $table->string('description')->nullable();
            $table->boolean('status')->default(0);
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::drop('role');
    }

}

角色与用户关系表

class CreateRoleUserTable extends Migration {
    public function up() {
        // Create table for associating roles to users (Many-to-Many)
        Schema::create('role_user', function (Blueprint $table) {
            $table->integer('user_id')->unsigned();
            $table->integer('role_id')->unsigned();

            $table->foreign('user_id')->references('id')->on('user')
                ->onUpdate('cascade')->onDelete('cascade');
            $table->foreign('role_id')->references('id')->on('role')
                ->onUpdate('cascade')->onDelete('cascade');

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

    public function down() {
        Schema::drop('role_user');
    }

}

在这些表之后,您必须通过分配给特定角色来处理权限。

允许

class Permission extends Migration {

    public function up() {
        Schema::create('permission', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name')->unique();
            $table->string('pattern');
            $table->string('target');
            $table->string('module');
            $table->string('display_name')->nullable();
            $table->boolean('status')->default(0);
            $table->timestamps();
        });
    }

    public function down() {
        Schema::drop('permission');
    }

}

权限与角色表关系

class PermissionRole extends Migration {
    public function up() {
        // Create table for associating roles to permission (Many-to-Many)
        Schema::create('permission_role', function (Blueprint $table) {
            $table->integer('permission_id')->unsigned();
            $table->integer('role_id')->unsigned();

            $table->foreign('permission_id')->references('id')->on('permission')
                ->onUpdate('cascade')->onDelete('cascade');
            $table->foreign('role_id')->references('id')->on('role')
                ->onUpdate('cascade')->onDelete('cascade');

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

    public function down() {
        Schema::drop('permission_role');
    }

}

最后我们的模型看起来很相似:

用户模型

namespace App;

use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class User extends Model implements AuthenticatableContract, CanResetPasswordContract {

    use Authenticatable, CanResetPassword;
    protected $table = 'user';
    protected $fillable = ['name', 'email', 'password', 'is_admin'];
    protected $hidden = ['password', 'remember_token'];

    public function scopeActive($query) {
        return $query->whereStatus('1');
    }
    public function scopeAdmin($query) {
        return $query->whereIsAdmin('1');
    }
    public function scopeNotify($query) {
        return $query->whereNotify('1');
    }

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

    public function attachRole($role) {
        if (is_object($role)) {
            $role = $role->getKey();
        }
        if (is_array($role)) {
            $role = $role['id'];
        }
        $this->roles()->attach($role);
    }

    public function detachRole($role) {
        if (is_object($role)) {
            $role = $role->getKey();
        }
        if (is_array($role)) {
            $role = $role['id'];
        }
        $this->roles()->detach($role);
    }

    public function attachRoles($roles) {
        foreach ($roles as $role) {
            $this->attachRole($role);
        }
    }

    public function detachRoles($roles) {
        foreach ($roles as $role) {
            $this->detachRole($role);
        }
    }

    public function isSuperUser() {
        return (bool)$this->is_admin;
    }

    public function hasAccess($permissions, $all = true) {
        if ($this->isSuperUser()) {
            return true;
        }
        return $this->hasPermission($permissions, $all);
    }

    public function hasPermission($permissions) {
        $mergedPermissions = $this->getMergedPermissions();
        //dd($mergedPermissions);
        if (!is_array($permissions)) {
            $permissions = (array)$permissions;
        }

        foreach ($permissions as $permission) {
            $matched = false;
            // We will set a flag now for whether this permission was
            // matched at all.
            $founded_perms = find_in($mergedPermissions, "name", $permission);
            if (!empty($founded_perms)) {
                $matched = true;
            }

        }

        if ($matched === false) {
            return false;
        }

        return true;
    }

    public function getMergedPermissions() {
        $permissions = array();
        foreach ($this->getRoles() as $group) {
            $permissions = array_merge($permissions, $group->permissions()->get()->toArray());
        }
        return $permissions;
    }

    public function getRoles() {
        $roles = [];
        if ($this->roles()) {
            $roles = $this->roles()->get();
        }
        return $roles;
    }
}

好榜样

namespace App;

use Illuminate\Database\Eloquent\Model;

class Role extends Model {
    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'role';
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['name', 'display_name', 'description'];

    public function scopeActive($query) {
        return $query->whereStatus('1');
    }

    /**
     * Many-to-Many relations with User.
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
     */
    public function users() {
        return $this->belongsToMany('App\User');
    }

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

}

权限模型

namespace App;

use Illuminate\Database\Eloquent\Model;

class Permission extends Model {
    protected $table = 'permission';
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['name', 'pattern', 'target', 'module', 'display_name', 'status'];

    public static function displayable() {
        $prepared_array = [];
        $temp = self::orderBy('module')->get()->toArray();
        foreach ($temp as $sin) {
            $prepared_array[$sin['module']][] = $sin;
        }
        return $prepared_array;
    }
    public function scopeActive($query) {
        return $query->whereStatus('1');
    }

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

嗯,这就是帮助使用 laravel 5 实现基本 ACL 和 Auth 的基本结构。

如果您还有任何其他相关问题,请告诉我。或者如果您需要完整的实施,我会提供给您。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Laravel 5 中建立用户和角色关系 的相关文章

  • Laravel 5.4 密码重置

    我有一个 Laravel 5 4 应用程序 我的管理区域中有一个视图 允许我查看所有用户 我想创建一个功能 允许我单击后端的按钮 自动发送默认 Laravel 密码重置功能的过程 在我看来 我有以下几点 table class table
  • Laravel 5 未找到“App\Carbon\Carbon”类

    我最近run sudo composer update 现在在我的一个页面上 我不断得到 我确实用过 now Carbon Carbon now America New York in line 792 on my Helper php M
  • Laravel 5.2 如何更新迁移而不丢失数据

    我使用的是 laravel 5 2 我通常会根据项目要求更新数据库 所以我希望在不丢失数据库记录的情况下执行此操作 我的意思不是如何为我的数据库播种 我的意思是当我的数据库处于活动状态并且我想更新它时抛出 laravel 迁移 我正要扔La
  • 附加之前检查数据库中是否存在 ID

    我通过选择一个带有类别的数组json decode并将它们附加到文章中 public static function setArticleCategory Request request article Article where id r
  • 如何使用 Laravel Mix 和 WorkBox?

    我正在尝试为我的应用程序构建一个 PWA 并花了近 48 小时试图弄清楚如何将 Workbox 与 Laravel Mix 结合使用 具有讽刺意味的是 谷歌说 Workbox 是为了让事情变得简单 Buh 好吧 到目前为止我已经弄清楚了 我
  • 暂时禁用/绕过中间件

    在我的应用程序中 我实现了 OAuth2 服务器 oauth2 服务器 laravel https github com lucadegasperi oauth2 server laravel 与自定义身份验证包 Cartalyst 的哨兵
  • laravel 5:找不到类“输入”

    In my routes php我有的文件 Route get function return view login Route get index function return view index Route get register
  • Laravel 中的支付网关回调时会话会自动销毁

    我正在尝试将 CCavenue com 支付网关集成到我的 Laravel 7 项目中 我面临的唯一问题是在回调 url 中 从支付网关获取发布数据后 活动会话会自动销毁 我还向中间件添加了 CSRF 例外 PayController 生成
  • Laravel:如何设置多对多关系的连接?

    我有模型 class User extends Model protected connection mysql public function areas return this gt belongsToMany Area class u
  • Laravel 5.3 Eloquent 事务和外键限制

    我正在从事一个更大的项目 我们在一个 Postgres 数据库中有多个模式 我们在模式之间创建了外键 这是一个例子 gt 我们有公司模式和用户模式 公司模式有company users表 该表对user users表有外键限制 CREATE
  • 无法在 Laravel 8 中运行迁移:SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: 名称或服务未知 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我不明白为什么我的迁移在全新安装 Laravel 8 时失败 这就是我得到的结果 Illuminate Database
  • 将策略应用到资源控制器

    我有一个CRUD资源定义通过Route resource User UserController 既然可以生成CRUDGates and Policies 有没有办法应用这样的Gate Policy 以便将相应的Gate Policy应用于
  • 如何在 Laravel 中 session_write_close() ?

    Running session write close before sleep 在 Laravel 中似乎不起作用 因为会话仍然被其他请求阻止 直到当前连接完成 我试图sleep 在 Laravel 中 不会阻止其他请求 发现 sessi
  • Laravel 5.6 - 注册表无法正常工作并且不显示任何错误

    在我最近的一个项目中 定制登记表不管用 当我单击注册按钮时 它会重新加载注册表单 不会打印任何错误 并且不会将数据插入数据库中 这是注册表的外观 这里是移民文件代码 public function up Schema create user
  • 在 Laravel 中按数据透视表 create_at 排序

    在我的数据库中 我有以下表格 courses id 名称 创建时间 更新时间 students id 名称 创建时间 更新时间 课程 学生 id course id student id created at updated at 我正在尝
  • Laravel Passport,通过密码客户端进行多个连接

    我无法理解如何使用 Laravel Passport 通过密码客户端为同一用户实现多个连接 我有一个移动应用程序 需要与基于 Laravel 的 API 进行通信 我的用户在首次启动应用程序时必须输入他们的login and passwor
  • Laravel 路由中的“as”关键字是什么意思?

    据我从 Laravel 文档中了解到 它用于重定向 但也许我错了 I wrote Route get user profile as gt profile function echo some text 然后我期望我的 URL 重定向自ht
  • Laravel 广播:通知与事件

    我阅读了 laravel 文档Events and Notifications 似乎我们可以触发一个事件 并从该事件中触发 使用ShouldBroadcast接口 将其广播到我理解的 laravel echo 另一方面我们可以使用通知via
  • 通过JS Laravel访问存储目录

    有没有办法访问storage目录 该目录已经链接到publicJS 中的目录 我正在尝试制作一个上传图片的表单 验证脚本 if request gt hasFile photos marker gt photos request gt ph
  • 如何使用 then() 将 Fetch 响应的 JSON 正文传递给 Throw Error()?

    EDIT 你误会了 考虑这个伪代码 这本质上是我想做的 但这样写是行不通的 一旦您使用 Fetch 收到 Laravel 422 响应 response不包含实际的 JSON 数据 你必须使用response gt response jso

随机推荐

  • ParseUI 本地化

    由于 ParseUI 是开源的 因此很容易发现所有标签都在 ParseUI strings 中本地化 如何告诉 xcode 在运行时不要使用 ParseUI strings 而使用 Localisable strings 我在我的项目中创建
  • 尝试使用 Java 中的 Gmail API 发送电子邮件时出错

    我想使用 Gmail API 而不是 JavaMail 发送电子邮件 我在论坛上读到了很多类似的主题 但仍然有一个问题 首先我读到了这个 https developers google com gmail api guides sendin
  • 如何在XML中编写具有多个命名空间的xsd文件?

    当我在 mec xsd 中定义 XML 模式时 它不适用于该元素 我该如何解决这个问题 谢谢
  • 在 Eclipse CDT 中创建一个新的 C++ 项目,设置与另一个项目相同

    是否有一种简单的方法来创建克隆现有项目设置的新 C 项目 在开发 C 时 我喜欢编写许多小测试和示例 但如果我的代码依赖于外部库 就像它们经常做的那样 我必须每次都从头开始设置包含 库 编译器设置等 有某种模板机制吗 我了解 C C 项目设
  • node.js oracledb 不插入也不更新

    节点 oracledb 版本 1 2 节点 v0 12 7 按预期选择工作 对于更新和插入 虽然我们得到 rowsAffected 1 但插入或更新不受影响 var oracledb require oracledb oracledb ge
  • 使用本地存储存储多个项目的复选框“已选中”

    我想将我的复选框保存到本地存储 但是我使用的这段代码对于多个复选框来说太麻烦了 有没有更好的方法来做到这一点 setStatus document getElementById LineOp setStatus onclick functi
  • 调用其他程序时Powershell变量扩展

    我在尝试使用解压缩文件时遇到一个小问题7za http 7 zip org download htmlPowershell 中的命令行实用程序 我设置了 zip source变量为 zip 文件的路径和 unzip destination到
  • 在 Vue.js 中使用异步/等待模式

    我想在我的新 Vue js 项目中使用 async await 模式 然而 在我第一次尝试后 它抛出了一个错误
  • TreeMap 是如何排序的

    如何TreeMap种类 举例来说 您有以下地图 TreeMap
  • 当互联网断开连接时,HttpClient PostAsync 不响应

    我有一个 xamarin 表单应用程序 该应用程序执行PostAsync调用将图像作为多部分内容上传 问题是在 iOS 设备中 当我在 PostAsync 调用期间关闭 wifi 移动数据时 HttpClient 不会进入 catch 块来
  • 如何从C#读取中文文本文件?

    如何使用 C 读取中文文本文件 我当前的代码无法显示正确的字符 try using StreamReader sr new StreamReader path System Text Encoding UTF8 This is an arb
  • 如何将JScrollPane布局设置为与JTable相同?

    Tabel1 setModel new DefaultTableModel x y JScrollPane pane new JScrollPane Tabel1 当我运行该程序时 滚动窗格看起来比表格大 如何使滚动窗格布局与表格相同 ho
  • Angular 4 - 获取输入值

    我想知道如何从角度 4 上的输入获取值 我查看了有关 Angular 的文档 并且带有关键事件的示例对我来说效果不太好 我找不到正确的示例如何做到这一点 所以请帮助我 问题 我尝试读取输入的值 然后将值提交到另一个组件 该组件会将值添加到选
  • 如何在opencv中使某些像素透明?

    我用 for 语句检查了每个像素的亮度 并尝试在亮度超过 100 时使其透明 但隐形是行不通的 看代码 image al x y 的第四个是alpha 我应该怎么办 如果你使用 bgr 的值而不是透明度 它就会改变 image cv2 im
  • symfony2 - Doctrine - 如何使用计数和分组进行多重选择

    在 Symfony2 和 Doctrine 中 我想执行一个返回计数和分组依据的查询 这是我尝试过的 这是我要运行的 SQL SELECT terrain id COUNT FROM Partie WHERE 1 1 GROUP BY te
  • 扩展/插件通信的架构

    一旦解决了加载插件的问题 在 NET 中 在例外情况下通过 MEF 下一步要解决的是与它们的通信 简单的方法是实现一个接口并使用插件实现 但有时插件只需要扩展应用程序的工作方式 并且可能有很多扩展点 我的问题是关于如何处理这些扩展点 我已经
  • 多态调用的成本 - C++

    我正在用 C 编写一个游戏 其中有大约 30 个不同的角色 每个角色都略有不同 我有一个主类 User 其中包含所有角色所需的所有数据 我的第一个实现涉及仅枚举 30 个角色并进行适当的处 理 但现在我想知道将 User 作为基类并且每个角
  • 谷歌搜索引擎优化和隐藏元素

    谷歌会忽略CSS中设置为 display none 的元素内的单词吗 Example div style display none About Us Contact Us div 我想隐藏这样的菜单看起来可能有点奇怪 但是有一个子菜单 并将
  • PersistFieldSql 的 GeneralizedNewtypeDeriving 失败

    我正在尝试定义一个Markdown https hackage haskell org package markdown 0 1 9 docs Text Markdown html新类型 并使用GeneralizedNewtypeDeriv
  • 如何在 Laravel 5 中建立用户和角色关系

    我有两张桌子 User gt id name role id gt references id gt on roles Roles gt id role name access 我正在尝试从用户访问角色详细信息 我的用户模型有 public