这是要求。我将对受公众限制的仪表板(系统管理员,经理,员工)进行三级访问。
系统管理员,简单地说就是超级管理员。他们能够索引,显示,创建,更新,删除所有公司和用户。
管理员由系统管理员创建并分配给公司,他们只能为他们所属的公司编制索引,显示,创建,更新,删除员工。
员工拥有对其公司信息和文件的只读访问权限。
这是我当前为用户提供的路线。 (使用Slim Framework)
仅受中间件保护的系统管理员访问: 这些操作是供系统管理员管理所有用户的。
Format
系统管理员&管理员只能访问受中间件保护的内容: 这些交互是管理员管理员工的
/*** USERS ***/
// View to List Users
$this->get('/users', 'App\Controller\User\UserController:index')->setName('user.index');
// View containing user registration form
$this->get('/users/new', 'App\Controller\User\UserController:create')->setName('user.create');
// Creates new user from registration form
$this->post('/users' , 'App\Controller\User\UserController:store');
// Show single user view
$this->get('/users/{id}', 'App\Controller\User\UserController:show')->setName('user.show');
// View containing edit user form
$this->get('/users/{id}/edit', 'App\Controller\User\UserController:edit')->setName('user.edit');
// Updates new user from edit user form
$this->put('/users/{id}', 'App\Controller\User\UserController:update');
// Deletes new user from edit user form
$this->delete('/users/{id}', 'App\Controller\User\UserController:delete');
您会注意到,对于系统管理员,不需要公司ID。但是,对于商店经理来说。因此,这些交互将具有单独的查询。我的问题更多的是关于最佳实践。这个解决方案对我来说似乎有点不太重要,但它有效地分离了关注点,并简化了每个控制器上的方法以及访问控制所需的中间件。我完全错了吗?
答案 0 :(得分:1)
我对所有角色都有相同的路由,因为URL代表了查看该信息的规范方式。
e.g。
$this->get('/companies/{id}/users', 'App\Controller\Company\CompanyUsersController:index')->setName('company.user.index');
是给定公司的用户列表的正确URL。
我知道商店经理只能访问自己公司的用户,但这并不意味着网址必须不同。这意味着即使她可以访问/companies/123/users
,也无法访问/companies/456/users
。这应该在组中间件或每个控制器中完成。就个人而言,我怀疑我会使用这样的组中间件:
$app->group(/companies/{id}, function () {
$this->get('/users', 'App\Controller\Company\CompanyUsersController:index')->setName('company.user.index');
})->add(CheckUserCompanyMiddlerware::class);
并显示错误页面或重定向回商店经理的正确网址,如果他们转到"错误"公司