我正在研究安全区域。花了几天时间在Symfony和API平台文档上后,我意识到我的关注点在于细节。 谈到Symfony中的安全性,我认为对于小型或内部项目而言,这很酷。我们可以根据需要添加/删除个人资料/角色。
我想做点特别的事。我希望用户或客户端(不是开发人员)能够通过后台,添加新的配置文件并分配权限。我使用安全区域而不是直接使用角色。我想在安全区域下保护我的动作(控制器)。
每个控制器都获得“ getSecurityZone()”方法,该方法可以让我首先检查该事件(内核事件),以查看当前用户是否对资源具有权限(取决于其唯一角色/配置文件)。
public function securityZone(): string
{
return 'BO_ZONE';
}
我的担心:我不想重写逻辑来检索数据,因为API平台已经做到了。所以我试图使用事件来运行我的安全检查。看来可行,但是如何从我的操作中调用默认操作(如GET)?
我的实体:
* },
* collectionOperations={
* "get"={
* "method"="GET",
* "path"="/users",
* "controller"=UserListAction::class,
* "defaults"={"_api_receive"=false},
* "swagger_context"={
* "parameters"={
*
* }
* },
* },
* "post"
* }
* )
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @ORM\Table(name="users")
*/
class User implements UserInterface
{
我的事件监听器:
public static function getSubscribedEvents()
{
return [
KernelEvents::VIEW => ['encodePassword', EventPriorities::PRE_WRITE],
KernelEvents::CONTROLLER => ['micheckSecurity', EventPriorities::PRE_READ],
];
}
//..
public function micheckSecurity(FilterControllerEvent $event)
{
$controller = $event->getController();
$method = $event->getRequest()->getMethod();
if (Request::METHOD_GET !== $method || $controller->getSecurityZone() !== Constants::SECZONE_BO_ZONE)
throw new AccessDeniedException("You are not author", 500);
return;
}
还有我的动作(控制器):
class UserListAction
{
public function __invoke()
{
//Call default operation which return collection
}
public function securityZone(): string
{
return 'BO_ZONE';
}
}
在我的_invoke()方法中,我想调用API Platform的read方法,该方法将自动返回集合。
感谢您的关注。