Laravel Пользователь разрешает доступ к определенным страницам?

Я создал слаг-страницы следующим образом:

   // 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 Создание динамических маршрутов для контроллеров из базы данных Mysql

У меня также есть таблица ролей:

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

У меня также есть другая таблица для разрешения:

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

Это поможет мне с настройкой разрешений для каждого типа роли, поэтому, например, если вы являетесь пользователем, вы можете получить доступ только к странице, если вы являетесь администратором, вы можете получить доступ ко всем страницам и т. Д.

Мой вопрос: как я могу это сделать, добавить ли в маршрут фильтр, который проверяет, может ли пользователь получить доступ к этой странице слагов? Так что я делаю это внутри rout.php или внутри filters.php? и как?

Спасибо за помощь

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 skug 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), поэтому я пытался помочь, но вам нужно попытаться реализовать остальное. Всего наилучшего.

Другие вопросы по тегам