我有一个关于过滤控制器及其针对多个用户角色的操作的问题。假设我有一个名为MyController的控制器:
public class MyController extends \BaseController
{
public static function index()
{
}
public static function show()
{
}
public static function create()
{
}
public static function store()
{
}
public static function other()
{
}
}
我为每个角色配备了2个过滤器,名为admin和staff:
Route::filter('admin', function()
{
// Lines of code to get role
if($role != 'admin') return View::make('errors.401');
});
Route::filter('staff', function()
{
// Lines of code to get role
if($role != 'staff') return View::make('errors.401');
});
然后,我试图在MyController的构造函数上使用beforeFilter:
public function __construct()
{
$this->beforeFilter('admin', ['only' => ['index', 'show', 'create', 'store']]);
$this->beforeFilter('staff', ['only' => ['index', 'show']]);
}
当我添加第一个beforeFilter时,它按预期工作(当我以人员身份登录我的应用程序时,我无法访问索引,显示,创建和存储方法)。但是当我添加第二个过滤器并再次以工作人员身份登录时,我无法访问索引并显示操作,这是我希望工作人员可以访问的。
我的问题是,是否可以在控制器的构造函数中为多个角色定义过滤器? (在这种情况下,我想让管理员和员工可以访问操作索引和显示,但只能由管理员访问创建和存储)如果有可能,我怎么能实现?
感谢。
答案 0 :(得分:1)
首先,你应该制作一个应该处理访问控制的控制器......如下所示
Acl Controller
class ACLController extends \BaseController {
/**
* admin access control list
* @return array
*/
private function adminACL() {
return array(
'users' => array(
'users',
'users.show',
//similar access list for admin users
),
);
}
/**
* staff access control list
* @return array
*/
private function staffACL() {
return array(
'staff' => array(
'staff',
'staff.index',
//similar access list for staff user
),
);
}
//Method that check access of related user
/**
* check access level
* @param string $value
* @return boolean
*/
public function hasAccessLevel($value) {
$user = //get user role here
if ($user->roles == 'staff') {
return TRUE;
} elseif ($user->roles == 'admin') {
$newAcl = array();
foreach ($this->adminACL() as $aclBreak) {
foreach ($aclBreak as $acl) {
$newAcl[] = $acl;
}
}
if (!in_array($value, $newAcl)) {
return FALSE;
} else {
return TRUE;
}
} else {
$newAcl = array();
foreach ($this->staffACL() as $aclBreak) {
foreach ($aclBreak as $acl) {
$newAcl[] = $acl;
}
}
if (!in_array($value, $newAcl)) {
return FALSE;
} else {
return TRUE;
}
}
}
}
过滤访问路线...
Route::filter('hasAccess',function($route,$request,$value){
try{
$Routeacl = new App\Controllers\ACLController();
if(!$acl->hasAccessLevel($value))
{
return Redirect::to('admin/dashboard')->withErrors(array(Lang::get('en.user_noaccess')));
}
}catch(\Exception $e){
echo $e->getMessage();
}
});
然后在您的路线中检查是否有权访问
Route::get('/', array('as' => 'index', 'before' => 'hasAccess:index', 'uses' => 'MyController@Index'));
快乐编码:)
答案 1 :(得分:0)
管理员是否始终是员工?如果是这样 - 你可以这样做:
Route::filter('staff', function()
{
// Lines of code to get role
if(($role != 'staff') && ($role != 'admin'))return View::make('errors.401');
});
答案 2 :(得分:0)
我假设您有管理员可以访问所有功能,员工可以访问除"显示"
之外的所有内容这是控制器
class MyController extends \BaseController
{
public function __construct(){
$this->beforeFilter('admin', ['only' => ['show']]);
}
public function index()
{
echo "index";
}
public function show()
{
echo "show";
}
}
在上一篇文章中看到,你正在使用公共课,我相信PHP你只需要上课,在功能上最好不要使用静态。
这是filters.php
Route::filter('admin', function()
{
// Lines of code to get role
if($role != 'admin') return "This is only for admin";
});
在routes.php中
Route::get("/my", "MyController@index");
Route::get("/show", "MyController@show");
然后尝试以管理员身份登录,您将可以访问" index"并且"显示" 然后尝试以员工身份登录,您将可以访问" index"但无法访问"显示"