zoukankan      html  css  js  c++  java
  • 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登录时访问的页面,区别为是否能看到"编辑文章"的链接

  • 相关阅读:
    Deployment progressDeadlineSeconds
    go字符串转[]bytes
    shell单引号内嵌套单引号即可使用变量
    ensp 模拟 calico 跨网段 bgp 网络
    如何利用termination GracePeriodSeconds 优雅地关闭你的服务
    gin是怎么传参数
    垃圾代码评析——关于《C程序设计伴侣》9.4——链表(三)
    垃圾“程序是怎样练成的”——关于《C程序设计伴侣》第A章(五)
    垃圾代码评析——关于《C程序设计伴侣》9.4——链表(四)
    垃圾“程序是怎样炼成的”——关于《C程序设计伴侣》第A章(二)
  • 原文地址:https://www.cnblogs.com/Caoxt/p/5007958.html
Copyright © 2011-2022 走看看