前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >laravel5.1的用户权限管理的实现 原

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

作者头像
lilugirl
发布2019-05-26 22:19:02
6300
发布2019-05-26 22:19:02
举报
文章被收录于专栏:前端导学前端导学

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

Laravel ACL 权限

先创建blogs表

代码语言:javascript
复制
php artisan make:migration create_blogs_table --create=blogs

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

代码语言:javascript
复制
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');
        });
    }

执行命令

代码语言:javascript
复制
php artisan migrate

生成model

代码语言:javascript
复制
php artisan make:model Blog

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

代码语言:javascript
复制
$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

代码语言:javascript
复制
php artisan make:controller BlogController

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

代码语言:javascript
复制
  public function show($id){
      $blog=\App\Blog::findOrFail($id);
      return $blog->title;
    }

在routes/web.php 中添加路由

代码语言:javascript
复制
Route::resource('blogs','BlogController');

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

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

编辑app/Providers/AuthServiceProvider.php

编辑app/Http/Controllers/BlogController.php

代码语言:javascript
复制
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添加代码

代码语言:javascript
复制
  public function owns(\App\Blog $blog){
      return $this->id==$blog->user_id;
    }

app/Http/Controllers/BlogController.php 改为

代码语言:javascript
复制
  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的作者,就可以显示编辑文章的内容

代码语言:javascript
复制
<h1>{{$blog->title}}</h1>
@can('show-blog',$blog)
<a href="#">编辑文章</a>
@endcan

Laravel Policy

创建policy文件

代码语言:javascript
复制
php artisan make:policy BlogPolicy

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

代码语言:javascript
复制
  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

代码语言:javascript
复制
php artisan make:model Permission
代码语言:javascript
复制
php artisan make:model Role

创建 roles表

代码语言:javascript
复制
php artisan make:migration create_roles_table --create=roles

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

代码语言:javascript
复制
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命令

代码语言:javascript
复制
php artisan migrate

实现用户权限管理

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Laravel ACL 权限
    • 下面我们将为这个blog的显示添加访问权限
    • 优化代码
      • 下面我们演示一下在view页面上实现权限控制
      • Laravel Policy
        • Setup Roles And Permissions
          • 实现用户权限管理
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
          http://www.vxiaotou.com