文档章节

laravel5.1的用户权限管理的实现

lilugirl
 lilugirl
发布于 2016/12/02 00:17
字数 749
阅读 67
收藏 2

本文是在基于laravel5.3的基础上实现

Laravel ACL 权限

先创建blogs表

php artisan make:migration create_blogs_table --create=blogs

修改database/migrations/2016_12_02_070731_create_blogs_table.php文件

public function up()
    {
        Schema::create('blogs', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->string('title');
            $table->text('body');
            $table->timestamps();
            $table->foreign('user_id')
                  ->references('id')
                  ->on('users')
                  ->onDelete('cascade');
        });
    }

执行命令

php artisan migrate

生成model 

php artisan make:model Blog

添加生成代码到database/factories/ModelFactory.php 

$factory->define(App\Blog::class, function (Faker\Generator $faker) {


    return [
        'user_id'=>factory(\App\User::class)->create()->id,
        'title' => $faker->sentence,
        'body' => $faker->paragraph,
    ];
});

执行tinker命令生成测试数据 同时各生成了一条blog和user数据

生成controller 

php artisan make:controller BlogController

app/Http/Controllers/BlogController.php 里添加方法

  public function show($id){
      $blog=\App\Blog::findOrFail($id);
      return $blog->title;
    }

在routes/web.php 中添加路由 

Route::resource('blogs','BlogController');

在浏览器中打开https://10yue.live/blogs/1 就可以看到到博客title

下面我们将为这个blog的显示添加访问权限

编辑app/Providers/AuthServiceProvider.php

编辑app/Http/Controllers/BlogController.php


namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;



class BlogController extends Controller
{
  public function show($id){
    $blog=\App\Blog::findOrFail($id);
    \Auth::loginUsingId(14);
    if(Gate::denies('show-blog',$blog)){
      abort(403,'Sorry');
    }
    return $blog->title;
  }
}


用浏览器打开https://10yue.live/blogs/1 看看

然后换一个用户登录 \Auth::loginUsingId(12);看看 https://10yue.live/blogs/1是否能打开

你会发现当blog的作者不是登录用户时会报错

其实app/Http/Controllers/BlogController.php 的authorize方法也能达到同样的效果

优化代码

在app/User.php添加代码

  public function owns(\App\Blog $blog){
      return $this->id==$blog->user_id;
    }

app/Http/Controllers/BlogController.php 改为

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

        $gate->define('show-blog',function($user,$blog){

        //  return $user->id==$blog->user_id;

            return $user->owns($blog);
        });
    }

 

下面我们演示一下在view页面上实现权限控制

controller页面改为

view页面 如果登录用户是blog的作者,就可以显示编辑文章的内容

<h1>{{$blog->title}}</h1>
@can('show-blog',$blog)
<a href="#">编辑文章</a>
@endcan

 

Laravel Policy 

创建policy文件

php artisan make:policy BlogPolicy

修改这个生成的文件 app/Policies/BlogPolicy.php 添加update方法

  public function update(User $user, Blog $blog){
       return $user->owns($blog);

    }

回到app/Providers/AuthServiceProvider.php 修改对应的boot方法 增加policy的注册

修改app/Http/Controllers/BlogController.php的show方法

修改 resources/views/blogs/show.blade.php

 

Setup Roles And Permissions 

创建2个model文件叫  一个叫Permission 一个叫Role

php artisan make:model Permission
php artisan make:model Role

创建 roles表

php artisan make:migration create_roles_table --create=roles

修改database/migrations/2016_12_07_100212_create_roles_table.php  的up方法

public function up()
    {
        Schema::create('roles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name'); //admin member;
            $table->string('label')->nullable(); //管理员 普通用户
            $table->timestamps();
        });

        Schema::create('permissions', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name'); //admin member;
            $table->string('label')->nullable(); //管理员 普通用户
            $table->timestamps();
        });

        Schema::create('permission_role', function (Blueprint $table) {
            $table->integer('permission_id')->unsigned();
            $table->integer('role_id')->unsigned();

            $table->foreign('permission_id')
                  ->references('id')
                  ->on('permissions')
                  ->onDelete('cascade');

            $table->foreign('role_id')
                  ->references('id')
                  ->on('roles')
                  ->onDelete('cascade');
            $table->primary(['permission_id','role_id']);


        });

        Schema::create('role_user', function (Blueprint $table) {
            $table->integer('user_id')->unsigned();
            $table->integer('role_id')->unsigned();

            $table->foreign('user_id')
                  ->references('id')
                  ->on('users')
                  ->onDelete('cascade');

            $table->foreign('role_id')
                  ->references('id')
                  ->on('roles')
                  ->onDelete('cascade');
            $table->primary(['user_id','role_id']);


        });
    }

执行migrate命令

php artisan migrate

实现用户权限管理

© 著作权归作者所有

lilugirl
粉丝 103
博文 477
码字总数 134917
作品 0
杨浦
程序员
私信 提问
加载中

评论(0)

Laravel 不权威导航

Laravel不权威导航 Hi 这里是Roy整理的Laravel相关索引,希望能帮到大家 ,目前只是一小部分,正在努力整理中... Laravel 文档 Laravel 官方文档 —— 英文 Laravel 中文文档 —— laravel-...

weixingo
2016/02/05
355
0
啦啦啦哈利路亚/laravel_biji

采用Laravel5.1框架的在线笔记系统 演示地址 http://120.27.102.104/auth/login 项目介绍 基于Laravel+Bootstrap+MariaDB开发系统架构 功能说明 在线笔记系统基于B/S结构的社区性质的协调信息...

啦啦啦哈利路亚
2017/03/08
0
0
laravel共享session, 实现单点登录

laravel开发效率高很适合做web开发,可是session自己进行了加密,需要实现不同应用单点登录就比较麻烦了,用nodejs实现了session的解密算法(只针对laravel5.1). 理论上其他服务只需要通过读c...

游鱼彩虹
2016/12/15
645
0
Laravel 生成_ide_helper.php文件

Github https://github.com/barryvdh/laravel-ide-helper 本文为Laravel5.1版本。 laravel配置好的前提下,并且已安装composer。 进入项目根目录执行 composer require barryvdh/laravel-id...

xinson
2015/11/03
878
0
laravel5.1框架 post表单提交,使用Form Request验证,验证失败后只是回到原页面,不提示error信息,这是为什么?

laravel5.1框架 post表单提交,使用Form Request验证,验证失败后只是回到原页面,不提示error信息,前台页面已经添加了 "@if (count($errors) > 0) @foreach ($errors->all() as $error) {{ $er......

wadasdasdw
2017/07/15
885
1

没有更多内容

加载失败,请刷新页面

加载更多

1核2G云服务哪家便宜?用来学习和搭建博客

前言: 又到一年续费时,我们来盘点哪些云厂商新手活动给力?有人说我又不是新手,有啥用?你要知道你作为家里唯一一位程序员,有强大的家庭后盾,比如爸爸妈妈爷爷奶奶叔叔阿姨......... 不过...

王念博客
31分钟前
339
1
JavaScript 箭头函数:适用与不适用场景

JavaScript 箭头函数:适用与不适用场景 现代 JavaScript 中最引人注目的功能之一是引入了箭头函数,用 => 来标识。 这种函数有两大优点 – 非常简洁的语法,和更直观的作用域和 this的绑定。...

王囧草
40分钟前
70
0
Docker快速入门

1 几个概念 Docker可以把开发的软件代码以及软件所依赖的所有运行时环境、依赖类库都打包成一个容器镜像,因此使用docker打包软件可以让程序员开发的程序运行在各种不同的计算机硬件环境中。...

即将秃头的Java程序员
41分钟前
83
0
Zookeeper-03-权限管理

Zookeeper-03-权限管理 用的不多,暂时先不整理了

moon888
42分钟前
36
0
渲染学习笔记——GPU应用阶段

1.GPU流水线 注:绿色可编程,橙色可控不可编程,红色完全不可控 2.顶点着色器 顶点着色器计算速度快于片元着色器,所以很多中间数据在顶点着色器计算。 3.裁剪 4.屏幕映射 5.三角形 6.片元着...

myctrd
48分钟前
64
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部