Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 两个表上的安全性Symfony2_Php_Security_Symfony_Service - Fatal编程技术网

Php 两个表上的安全性Symfony2

Php 两个表上的安全性Symfony2,php,security,symfony,service,Php,Security,Symfony,Service,我使用的是Symfony 2.3,我找不到一个好的解决方案来在两个表上添加安全性 我有一个用户,这个用户可以获得一个应用程序,他可以通过以下路径访问他的应用程序:/application/{id} 因此,如果用户链接到应用程序,我希望保护此页面。我做了一些检查我的控制器,但这不是很干净: /** * * @param int $idApplication * @return UserApplication */ public function testUserApplication($

我使用的是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 ! ');