【问题标题】:Laravel User permission to access certain pages?Laravel 用户访问某些页面的权限?
【发布时间】:2014-06-03 05:24:44
【问题描述】:

我创建了一个如下所示的 slug 页面:

// Create pages table for dynamic pages
| id |  slug   |   title    | page_template |
|  0 | about   | about us   | about.blade   |
|  1 | contact | contact us | contact.blade |

我将通过以下途径访问它们:

// could be page/{slug} or only slug inside routes.php
Route::get('/{slug}', array('as' => 'page.show', 'uses' => 'PageController@show'));

我有一个 PageController,所以这允许我动态创建页面。 参考这里的解决方案:Laravel Creating Dynamic Routes to controllers from Mysql database

我还有一个角色表:

// Create roles table for
| id | name  |
|  0 | user  |
|  1 | admin |

我还有一张表要权限:

// permission table 
| role_id | page_id |
|    0    |    0    |
|    0    |    1    |
|    1    |    1    |

这将帮助我为每个角色类型设置权限,例如,如果您是用户,则只能访问关于页面,如果您是管理员,则可以访问所有页面等。

我的问题是:我怎样才能做到这一点,我是否要在我的路由中添加一个过滤器来检查用户是否可以访问该 slug 页面?那么我应该在routes.php 还是在filters.php 内部执行此操作?怎么做?

感谢您的帮助

【问题讨论】:

    标签: php laravel laravel-4 user-permissions


    【解决方案1】:

    您需要如下设置。创建具有四个表(用户、角色、权限和权限角色)的类(模型):

    表roles:

    id | name (role name)
    1  | admin
    2  | user
    

    型号Role:

    class Role extends ELoquent {
    
        protected $table = 'roles';
    
        public function users()
        {
            return $this->hasMany('User', 'role_id', 'id');
        }
    
        public function permissions()
        {
            return $this->belongsToMany('Permission');
        }
    }
    

    表permissions:

    id | name (permission name)
    1  | manage_pages (add/edit/delete)
    2  | manage_users (add/edit/delete)
    3  | page_about (access allowed to about page)
    4  | page_contact (access allowed to contact page)
    

    型号Permission

    class Permission extends ELoquent {
    
        protected $table = 'permissions';
    
        public function roles()
        {
            return $this->belongsToMany('Role');
        }
    }
    

    表users:

    id | username | email           | password | role_id | more...
    1  | admin    | admin@ymail.com | hashed   |    1    | more...
    2  | user1    | user1@ymail.com | hashed   |    2    | more...
    3  | user2    | user2@ymail.com | hashed   |    2    | more...
    

    型号User

    class User extends ELoquent {
    
        protected $table = 'users';
    
        public function role()
        {
            return $this->belongsTo('Role', 'role_id', 'id');
        }
    
        public function can($perm = null)
        {
            if(is_null($perm)) return false;
            $perms = $this->role->permissions->fetch('name');
            return in_array($perm, $perms->toArray());
        }
    }
    

    表permission_role(数据透视表):

    id | permission_id | role_id
    1  | 1             | 1
    2  | 2             | 1
    3  | 3             | 1
    4  | 4             | 1
    5  | 3             | 2
    6  | 4             | 2
    

    完成此设置后,您可以创建过滤器或在您的类方法中检查登录用户是否具有特定规则或权限,然后允许访问页面,否则不允许。例如,您可以使用以下方式检查登录用户是否可以访问页面:

    if(Auth::user->can('manage_pages')) {
        // Let him/her to add/edit/delete any page
    }
    

    由于您的页面是动态的,并且所有页面都由 show 方法显示,因此在您的 show 方法中,您可以检查如下内容:

    public function show($slug = 'home')
    {
        // assumed page slug is 'about'
        $permission = 'page_' . $slug;
        if(Auth::user->can($permission)) {
            $page = page::whereSlug('home')->get();
            return View::make('pages.index')->with('page', $page);
        }
    }
    

    这确实是一个大问题,您必须自己解决。我给了你一些实现的基本想法,现在你应该扩展它。


    P/S:不可能从头开始回答所有问题,但我参与了您的同一个项目的另一个答案,我建议您实施权限基础 (ACL),所以我试图提供帮助但你需要尝试实现其余的。一切顺利。

    【讨论】:

    • 谢谢 Wolf,但我很困惑这张表在哪里可以使用您的代码权限角色?
    • permission_role 被称为数据透视表,因为您的roles 和permissions 表之间存在many- to-namy 关系,这个数据透视表映射了Role 和@987654344 之间的关系@。该表中的每个permission_id 和role_id 都是一个关系。
    • 我正在检查你提供的 can 方法,我想知道这会返回什么 $perms = $this->role->permissions->fetch('name');
    • 它将返回与该角色关联的权限,尝试$r = Role::with('Permission')->all(); dd($r),您将获得具有与该角色关联的所有权限的角色。
    • 这太好了,,,我们可以扩展它,因为一些应用程序需要更具体的角色,比如 3 个不同的用户对模块有不同的访问权限等
    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多