我有一个相当简单的ACL系统设置。过滤器检查用户是否是可以访问路由的用户组的一部分,或者用户是否有权访问该路由。它适用于各个路线,适用于一般资源。但是,我希望一些用户可以访问资源路由的特定方法,但不是所有用户都可以访问。例如,user1是admin组的一部分,并且始终可以访问admin资源路由,但user2不是admin用户组的一部分,我想让他访问teh资源admin / create。如何使用我的设置在Laravel 4中进行此操作
数据库
Routes:
id
route
created_by
last_editted_by
created
updated
deleted_at
acl (table it looks at to see if user has access)
id
routes_id
user_id
group_id
created
updated
deleted_at
Filter
if (Auth::check()){
$route = Request::segment(1);
$user_id = Auth::user()->id;
$acl_count = Acls::join('routes','routes.id','=','acl.routes_id')
->where('routes.route','=',$route)
->Where(function($in_parenthesis) use($user_id){
$in_parenthesis->whereIn('acl.group_id',function($where_in) use($user_id){
$where_in->select('group_id')
->from('user_group_junction')
->where('user_id','=',$user_id);
})
->orWhere('acl.user_id','=',$user_id);
})
->count();
if($acl_count < 1){
return Redirect::to('/');
}
}else{
return Redirect::to('/');
}
Routes
Route::get('/','HomeController@index');
Route::get('login','AuthorizationController@loginForm');
Route::post('authenticate','HomeController@authenticate');
Route::get('logout','HomeController@logout');
Route::group(array('before'=>'auth'),function(){
Route::group(array('before'=>'user_permission'),function(){
Route::get('protected','HomeController@protectedPage');
Route::resource('sources', 'SourcesController');
Route::resource('admins', 'AdminsController');
});
});
答案 0 :(得分:2)
您可以在beforeFilter
的{{1}}方法中使用__construct
,如下所示(仅为管理员控制器创建不同的方法)
AdminBaseController
此外,您可以在class AdminController extends AdminBaseController {
function __construct() {
// Use filter on all methods but not on create
$this->beforeFilter('admin', array('except' => array('create')));
}
}
控制器中直接使用此beforeFilter
并使用resource
,也可以使用except
(仅限反向工作,但允许访问所有人)但过滤器只提到了数组中的方法)。您还可以检查构造函数方法中的条件。
答案 1 :(得分:1)
我发现我的部分问题在于过滤器。如果我的路线(无论是资源还是仅包含“/”的路线)都无效,我只会查看网址的第一段无法正常工作。因此我问了另一个问题here