两张桌子上的安全Symfony2


security on two tables Symfony2

我使用的是Symfony 2.3,但我找不到在两个表上添加安全性的好解决方案。

我有一个用户,这个用户可以获得一个应用程序,他可以使用以下路径访问他的应用程序:/application/{id}

因此,如果用户是应用程序的链接,我想保护这个页面。我做了一些事情来检查我的控制器,但这不是很干净:

/**
 * 
 * @param int $idApplication
 * @return UserApplication
 */
public function testUserApplication($idApplication){
    //get the application
    $applicationRepository = $this->getDoctrine()->getRepository('PhoneApplicationBundle:Application');
    $application = $applicationRepository->find($idApplication);
    if($application==null){
        return null;
    }
    $userApplicationRepository = $this->getDoctrine()->getRepository('PhoneApplicationBundle:UserApplication');
    $userApplication = $userApplicationRepository->findOneBy(array(
            'user' => $this->getUser(),
            'application' => $application
    ));
    return $userApplication;
}

我不知道我是否可以使用安全措施来完成这项工作。

我尝试另一种解决方案,创建一个检查的服务

class Test
{
/** @var 'Doctrine'ORM'EntityManager */
private $doctrine;
/**
 * Constructor
 *
 * @param Doctrine        $doctrine
 */
public function __construct(Doctrine $doctrine)
{
    $this->doctrine = $doctrine;
}
public function userApplication($idApplication){
    //get the application
    $applicationRepository = $this->doctrine->getRepository('PhoneApplicationBundle:Application');
    $application = $applicationRepository->find($idApplication);
    if($application==null){
        return null;
    }
    $userApplicationRepository = $this->doctrine->getRepository('PhoneApplicationBundle:UserApplication');
    $userApplication = $userApplicationRepository->findOneBy(array(
            'user' => $this->getUser(),
            'application' => $application
    ));
    return $userApplication;
}
}

service.yml:

parameters:
    phone_application.test_user_application.class: Phone'ApplicationBundle'Service'Test
services:
    phone_application.test_user_application:
        class: %phone_application.test_user_application.class%
        arguments: [@doctrine]

但我真的不明白如何在控制器中使用它

谢谢你的帮助。

第一个

如果你想在控制器中使用服务,请执行

$serv = $this->get('nameoftheservice);
//then 
$serv->yourFunctionOfTheService();

在您的情况下:

$serv = $this->get('phone_application.test_user_application');
//then 
$serv->userApplication($id);

第二次

另一种方法:

如果$user对象在您的控制器中完全可用,只需执行:

//get the app
$application = $this->getDoctrine()->getRepository('PhoneApplicationBundle:Application')->find($idApplication);
//check if this user owns this app, considering you have sets the right doctrine annotation for relation in your entity file
if($user->getApplications()->contains($application)) {
    //do your stuff
}
else
    throw new 'Exception('No right there ! ');