如何使用三个级别的用户访问权限路由多级用户列表和创建操作



这是要求。我将对受公众限制的仪表板(系统管理员、经理、员工)具有三个级别的访问权限。

系统管理员,简单地说就是超级管理员。他们能够索引,显示,创建,更新,删除所有公司和用户。

经理由系统管理员创建并分配给公司,他们只能为他们所属的公司编制索引,显示,创建,更新,删除员工。

员工对其公司信息和文件具有只读访问权限。

这是我目前为用户提供的路线。(使用纤薄框架)

仅受中间件保护的系统管理员访问权限:这些操作供系统管理员管理所有用户。

/*** USERS ***/
// View to List Users
$this->get('/users', 'AppControllerUserUserController:index')->setName('user.index');
// View containing user registration form
$this->get('/users/new', 'AppControllerUserUserController:create')->setName('user.create');
// Creates new user from registration form
$this->post('/users' , 'AppControllerUserUserController:store');
// Show single user view
$this->get('/users/{id}', 'AppControllerUserUserController:show')->setName('user.show');
// View containing edit user form
$this->get('/users/{id}/edit', 'AppControllerUserUserController:edit')->setName('user.edit');
// Updates new user from edit user form
$this->put('/users/{id}', 'AppControllerUserUserController:update');
// Deletes new user from edit user form
$this->delete('/users/{id}', 'AppControllerUserUserController:delete');

系统管理员和经理仅受中间件保护的访问权限:这些交互供经理管理员工

/*** COMPANIES Employees ***/
// View to List Companies employees
$this->get('/companies/{id}/users', 'AppControllerCompanyCompanyUsersController:index')->setName('company.user.index');
// View containing new employee registration form
$this->get('/companies/{id}/users/new', 'AppControllerCompanyCompanyUsersController:create')->setName('company.user.create');
// Creates new employee from registration form
$this->post('/companies/{id}/users' , 'AppControllerCompanyCompanyUsersController:store');
// Show single user
$this->get('/companies/{id}/users/{id}', 'AppControllerCompanyCompanyUsersController:show')->setName('company.user.show');
// View containing edit company employee form
$this->get('/companies/{id}/users/{id}/edit', 'AppControllerCompanyCompanyUsersController:edit')->setName('company.user.edit');
// Updates user from edit user form
$this->put('/companies/{id}/users/{id}', 'AppControllerCompanyCompanyUsersController:update');
// Deletes new user from edit user form
$this->delete('/companies/{id}/users/{id}', 'AppControllerCompanyCompanyUsersController:delete');

您会注意到,对于系统管理员,公司 ID 不是必需的。但是,对于商店经理来说确实如此。因此,这些交互将具有单独的查询。我的问题更多的是关于最佳实践。这个解决方案对我来说似乎有点多余,但它有效地分离了关注点,并简化了每个控制器上的方法以及访问控制所需的中间件。我这样做完全错了吗?

我将对所有角色使用相同的路由,因为 URL 表示查看该信息的规范方式。

例如

$this->get('/companies/{id}/users', 'AppControllerCompanyCompanyUsersController:index')->setName('company.user.index');

是给定公司的用户列表的正确 URL。

我知道商店经理只能访问她自己公司的用户,但这并不意味着 URL 必须不同。这意味着即使她可以访问/companies/123/users,她也无法访问/companies/456/users。这应该在组中间件或每个控制器中完成。就个人而言,我怀疑我会像这样使用组中间件:

$app->group(/companies/{id}, function () {
$this->get('/users', 'AppControllerCompanyCompanyUsersController:index')->setName('company.user.index');
})->add(CheckUserCompanyMiddlerware::class);

并显示错误页面,或者如果他们转到"错误"的公司,则重定向回商店经理的正确 URL。

最新更新