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