牛骨文教育服务平台(让学习变的简单)
博文笔记

laravel的rbac

创建时间:2017-10-20 投稿人: 浏览次数:128

1、安装Entrust

    通过composer安装扩展包 :composer require zizaco/entrust 5.2.x-dev

   安装完成后需要在config/app.php中注册服务提供者到providers数组:

        ZizacoEntrustEntrustServiceProvider::class,

   同时在该配置文件中注册相应门面到aliases数组:

      "Entrust" => ZizacoEntrustEntrustFacade::class,

   如果使用中间件需要添加如下代码到app/Http/Kernel.php的routeMiddleware数组:

   "role" => izacoEntrustMiddlewareEntrustRole::class,

   "permission" => izacoEntrustMiddlewareEntrustPermission::class,

   "ability" => izacoEntrustMiddlewareEntrustAbility::class,

2、配置

在配置文件config/auth.php中设置合适的值,Entrust会使用这些配置值来选择相应的用户表和模型类。

php artisan vendor:publish

该命令会在config目录下创建一个entrust.php文件。

3、用户角色权限表

使用Entrust提供的迁移命令生成迁移文件:

php artisan entrust:migration

然后通过以下命令生成相应的数据表:

php artisan migrate

最终会生成4张新表:

roles—— 存储角色

permissions—— 存储权限

role_user—— 存储角色与用户之间的多对多关系

permission_role—— 存储角色与权限之间的多对多关系

4、模型类

Role

我们需要创建Role模型类app/Models/Role.php并编辑其内容如下:

use ZizacoEntrustEntrustRole;
class Role extends EntrustRole{}

Permission

接下来创建Permission模型app/models/Permission.php并编辑其内容如下:

use ZizacoEntrustEntrustPermission;
class Permission extends EntrustPermission
{
    
}

User

接下来我们在User模型中使用EntrustUserTrait:

use IlluminateNotificationsNotifiable;
use IlluminateFoundationAuthUser as Authenticatable;
use ZizacoEntrustTraitsEntrustUserTrait;
use IlluminateDatabaseEloquentModel;  

class User extends Authenticatable
{
    use EntrustUserTrait
    {
        EntrustUserTrait::can as hasPermission;
    }
}

5.创建角色/权限并进行分配

/**
     * 添加角色
     */
    public function add_role()
    {
        $role=new Role();
        $role->name="admin";
        $role->display_name="超级管理员";
        $role->description="";
        $role->save();
    }
    /**
     * 给用户分配角色
     */
    public function send_role()
    {
        $user = User::where("id", "=", "1")->first();

        //分配一个用户

        $user->attachRole(1);   //将角色id为1的分配给用户

        //分配多个角色

        $user->attachRoles()   //括号里放数组

    }

 /**
     * 添加权限
     */
    public function add_permission()
    {
        $createPost = new Permission();
        $createPost->name = "login";
        $createPost->display_name = "登录";
        $createPost->description = "";
        $createPost->save();
    }  

/**
     * 分配权限
     */
    public function send_permission()
    {
        //查询角色id为5的
        $role = Role::where(["id"=>1])->first();
        //分配单个权限
        $role->attachPermission(1);
        //分配多个权限
        $role->attachPermission(array(1,2,3));
    }

6、检查角色&权限

    //检查用户是否有admin的角色,成功返回true否则false
    $user->hasRole("admin");
    //检查用户是否有login的权限,成功返回true否则false,一下两者皆可
    $user->can("login");
    $user->hasPermission("login");

7.用中间件验证用户是否有当前路由的权限

namespace AppHttpMiddleware;

use Closure;
use AppHttpModelsAdmin;

class RbacMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $uid=Session::get("admin_id");
        $user=Admin::where(["id"=>$uid])->first();

       //获取当前访问的路由

        $uri = $request->path();
        if($uri!="admin/index" && $user->hasPermission($uri)==false){
            return redirect("admin/index");
        }
        return $next($request);
    }





声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。