0

我正在使用 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;
}

}

服务.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]

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

感谢帮助。

4

1 回答 1

1

第一的

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

$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 ! ');
于 2013-06-26T13:19:35.100 回答