如何使用三级用户访问路由多级用户列表和创建操作。

How to route multi-level user listing and creation actions with three levels of user access.

这是要求。我将对受 public(系统管理员、经理、员工)限制的仪表板进行三个级别的访问。

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

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

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

这是我为用户提供的当前路线。 (使用 Slim 框架)

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

/*** 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');

仅限系统管理员和经理访问受中间件保护: 这些互动是为了经理管理员工

/*** COMPANIES Employees ***/

// View to List Companies employees
$this->get('/companies/{id}/users', 'App\Controller\Company\CompanyUsersController:index')->setName('company.user.index');

// View containing new employee registration form
$this->get('/companies/{id}/users/new', 'App\Controller\Company\CompanyUsersController:create')->setName('company.user.create');

// Creates new employee from registration form
$this->post('/companies/{id}/users' , 'App\Controller\Company\CompanyUsersController:store');

// Show single user
$this->get('/companies/{id}/users/{id}', 'App\Controller\Company\CompanyUsersController:show')->setName('company.user.show');

// View containing edit company employee form
$this->get('/companies/{id}/users/{id}/edit', 'App\Controller\Company\CompanyUsersController:edit')->setName('company.user.edit');

// Updates user from edit user form
$this->put('/companies/{id}/users/{id}', 'App\Controller\Company\CompanyUsersController:update');

// Deletes new user from edit user form
$this->delete('/companies/{id}/users/{id}', 'App\Controller\Company\CompanyUsersController:delete');

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

我会为所有角色设置相同的路由,因为 URL 代表查看该信息的规范方式。

例如

$this->get('/companies/{id}/users', 'App\Controller\Company\CompanyUsersController:index')->setName('company.user.index');

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

我知道商店经理只能访问她自己公司的用户,但这并不意味着 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);

如果商店经理去 "wrong" 公司,则显示错误页面或重定向回正确的 URL。