Laravel 5.1 ACL权限控制 一

  请自行添加命名空间,代码下载地址 https://github.com/caoxt/learngit

1、所需要用到的数据表

  users(用户表)、roles(角色表)、role_user(用户角色对应表)、permissions(权限表)、permission_role(权限角色对应表)、posts(文章表)

  -----------------------以上命令也同样可以在phpmyadmin里完成------------------

2、使用migration创建以上数据表

  posts(文章表)

php artisan make:migration create_posts_table --create=posts
 1     public function up()
 2     {
 3         Schema::create('posts', function (Blueprint $table) {
 4             $table->increments('id');
 5             $table->integer('user_id')->unsigned();
 6             $table->string('title');
 7             $table->text('body');
 8             $table->timestamps();
 9             $table->foreign('user_id')
10                 ->references('id')
11                 ->on('users')
12                 ->onDelete('cascade');
13         });
14     }
php artisan migrate

3、生成测试数据

 php artisan make:model Post

 在database/factories/ModelFactory.php在添加

$factory->define(AppPost::class, function (FakerGenerator $faker) {
    return [
        'user_id' => factory(AppUser::class)->create()->id,
        'title' => $faker->sentence,
        'body' => $faker->paragraph,
    ];
});
php artisan tinker
factory('AppPost')->create();
factory('AppUser')->create();

  此时第一条create会在post和user表格创建一条数据,第二条create只会在user表中创建一条数据

  4、创建Post控制器;

php artisan make:controller PostController

  ------------------------以下为访问一条尚未添加权限的文章--------------------------

  5、在routes.php里添加一条路由

Route::resource('post', 'PostController');

  6、在PostController.php中从数据库中取出一条数据并输出到视图

  public function show($id)
    {
        //
        $post = Post::find($id);
        return view('post.show', compact('post'));
    }

  7、show.blade.php

  标题:{{ $post->title }}
  <br>
  内容:{{ $post->body }}

  预览:

      

  -------------------------以下实现非文章作者则拒绝访问--------------------------

  8、在Http/Providers/AuthServiceProvide.php中定义权限

    public function boot(GateContract $gate)
    {
        $this->registerPolicies($gate);

        $gate->define('show-post', function ($user, $post) {
            return $user->owns($post);
        });
    }

  此处$user会拿到登录user的表信息,$post会拿到所访问posts表信息

  在User.php文件中添加

    public function owns($post) {
        return $this->id == $post->user_id;
    }

  在PostController.php中检查是否认证用户

    public function show($id)
    {
        //
        $post = Post::findOrFail($id);
        Auth::loginUsingId(1);//登录用户id
        if (Gate::denies('show-post', $post)) {  
            dd('无认证');
        }
        return view('post.show', compact('post'));
    }

  分别测试用户id1和id2登录时访问的页面

       

--------------------------------以下为 假如两个用户都可以访问页面,实现只有文章作者才可以有编辑权限----------------------------------------------

  9、在PostController.php中修改为

    public function show($id)
    {
        //
        $post = Post::findOrFail($id);
        Auth::loginUsingId(2);//登录用户id
        /*
       if (Gate::denies('show-post', $post)) { dd('无认证'); }*/ return view('post.show', compact('post')); }

  10、在show.blade.php视图中修改为

  标题:{{ $post->title }}
  <br>
  内容:{{ $post->body }}
  @can('show-post', $post)
  <a href="#">编辑文章</a>
  @endcan

  分别测试用户id1和id2登录时访问的页面,区别为是否能看到"编辑文章"的链接

原文地址:https://www.cnblogs.com/Caoxt/p/5007958.html