use*_*060 3 php user-permissions laravel laravel-4
我创建了一个slug页面如下:
// Create pages table for dynamic pages
id | slug | title | page_template
0 about about us about.blade
1 contact contact us contact.blade
Run Code Online (Sandbox Code Playgroud)
我将通过以下路径访问它们:
// could be page/{slug} or only slug inside routes.php
Route::get('/{slug}', array('as' => 'page.show', 'uses' => 'PageController@show'));
Run Code Online (Sandbox Code Playgroud)
我有一个PageController,所以这允许我动态创建页面.在这里提到解决方案:Laravel从Mysql数据库创建动态路由到控制器
我还有角色表:
// Create roles table for
id | name
0 user
1 admin
Run Code Online (Sandbox Code Playgroud)
我还有另一张表允许:
// permission table
role_id | page_id
0 0
0 1
1 1
Run Code Online (Sandbox Code Playgroud)
这将帮助我设置每个角色类型的权限,例如,如果您是一个用户,您只能访问有关页面,如果您是管理员,您可以访问所有页面等.
我的问题是:我怎么能实现这一点,我是否在我的路线中添加一个过滤器,检查用户是否可以访问该段页面?所以我在routes.php或filters.php里面这样做?如何?
谢谢您的帮助
The*_*pha 13
你需要一个像下面这样的设置.使用四个表(用户,角色权限和permission_role)创建类(模型):
表roles:
id | name (role name)
1 | admin
2 | user
Run Code Online (Sandbox Code Playgroud)
型号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');
}
}
Run Code Online (Sandbox Code Playgroud)
表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)
Run Code Online (Sandbox Code Playgroud)
模型 Permission
class Permission extends ELoquent {
protected $table = 'permissions';
public function roles()
{
return $this->belongsToMany('Role');
}
}
Run Code Online (Sandbox Code Playgroud)
表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...
Run Code Online (Sandbox Code Playgroud)
模型 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());
}
}
Run Code Online (Sandbox Code Playgroud)
表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
Run Code Online (Sandbox Code Playgroud)
完成此设置后,您可以创建过滤器,或者在类方法中,您可以检查登录用户是否具有特定规则或权限,然后允许访问页面,否则不允许.例如,您可以使用以下内容检查登录用户是否可以访问页面:
if(Auth::user->can('manage_pages')) {
// Let him/her to add/edit/delete any page
}
Run Code Online (Sandbox Code Playgroud)
由于您的页面是动态的,并且所有页面都是通过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);
}
}
Run Code Online (Sandbox Code Playgroud)
这真的是一个大问题,你必须自己解决这个问题.我给了你一些实现的基本想法,现在你应该扩展它.
P/S:不可能从地面回答所有问题,但是我参与了你的同一个项目的另一个答案,我建议你实施一个权限基础(ACL),所以我试着帮助但你需要尝试实施其余的.祝一切顺利.
| 归档时间: |
|
| 查看次数: |
10000 次 |
| 最近记录: |