如何在特征中使用 authorizationChecker
How to use authorizationChecker inside a trait
我有一个特征可以检查用户是否登录以及尝试访问特定位置的次数。
我试图在 FormType 中使用这个特性,以便在多次尝试后显示验证码。
内部 getIpOrUserId()
我正在尝试检查用户是否已登录 $this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')
但 returns 出现错误
Attempted to call an undefined method named "get" of class
.
我认为不可能将特征创建为服务,因此我可以注入安全对象。
有办法实现吗?
Trait
<?php
Trait CheckAttempts {
public function getTryAttempts()
{
if ($this->getIpOrUserId() == null) {
return false;
} else {
$attempts = $this->getDoctrine()
->getRepository('SiteBundle:LoginAttempts')
->findOneByIpOrUserId($this->getIpOrUserId());
}
return $attempts->getAttempts();
}
protected function getIpOrUserId()
{
//get logged in user
//if ($this->authorizationChecker->isGranted('IS_AUTHENTICATED_FULLY')) {
if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
$ipOrUserId = $this->get('security.token_storage')->getToken()->getUser()->getId();
} else {
$ipOrUserId = $this->container->get('request_stack')->getCurrentRequest()->getClientIp();
}
return $ipOrUserId;
}
FormType
class RegisterType extends AbstractType
{
use FormSendLimitTrait;
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$form = $event->getForm();
var_dump($this->getTryAttempts());
$form->add('captcha', 'captcha',
'label' => 'site.captcha'
]);
/*if ($attempts->getAttempts() > 6) {
$form->add('captcha', 'captcha', [
'label' => 'site.captcha'
]);
}*/
})
get
方法仅在扩展 Symfony\Bundle\FrameworkBundle\Controller\Controller
class 时有效,通常在控制器 classes 中使用。而且它returns只有$this->container->get($id)
,没有别的,这意味着它returnsSymfony\Component\DependencyInjection\Container
class。您应该将 security.authorization_checker
服务注入您的 class(或您想要的其他服务),甚至整个 service_container
服务(但不推荐) .
示例:
class MyClass
{
private $securityChecker;
public function __construct(Symfony\Component\Security\Core\Authorization\AuthorizationChecker $securityChecker)
{
$this->securityChecker = $securityChecker;
}
...
}
services.yml
services:
my_class_service:
class: Acme\DemoBundle\MyClass
arguments:
- @security.authorization_checker
我有一个特征可以检查用户是否登录以及尝试访问特定位置的次数。
我试图在 FormType 中使用这个特性,以便在多次尝试后显示验证码。
内部 getIpOrUserId()
我正在尝试检查用户是否已登录 $this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')
但 returns 出现错误
Attempted to call an undefined method named "get" of class
.
我认为不可能将特征创建为服务,因此我可以注入安全对象。
有办法实现吗?
Trait
<?php
Trait CheckAttempts {
public function getTryAttempts()
{
if ($this->getIpOrUserId() == null) {
return false;
} else {
$attempts = $this->getDoctrine()
->getRepository('SiteBundle:LoginAttempts')
->findOneByIpOrUserId($this->getIpOrUserId());
}
return $attempts->getAttempts();
}
protected function getIpOrUserId()
{
//get logged in user
//if ($this->authorizationChecker->isGranted('IS_AUTHENTICATED_FULLY')) {
if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
$ipOrUserId = $this->get('security.token_storage')->getToken()->getUser()->getId();
} else {
$ipOrUserId = $this->container->get('request_stack')->getCurrentRequest()->getClientIp();
}
return $ipOrUserId;
}
FormType
class RegisterType extends AbstractType
{
use FormSendLimitTrait;
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$form = $event->getForm();
var_dump($this->getTryAttempts());
$form->add('captcha', 'captcha',
'label' => 'site.captcha'
]);
/*if ($attempts->getAttempts() > 6) {
$form->add('captcha', 'captcha', [
'label' => 'site.captcha'
]);
}*/
})
get
方法仅在扩展 Symfony\Bundle\FrameworkBundle\Controller\Controller
class 时有效,通常在控制器 classes 中使用。而且它returns只有$this->container->get($id)
,没有别的,这意味着它returnsSymfony\Component\DependencyInjection\Container
class。您应该将 security.authorization_checker
服务注入您的 class(或您想要的其他服务),甚至整个 service_container
服务(但不推荐) .
示例:
class MyClass
{
private $securityChecker;
public function __construct(Symfony\Component\Security\Core\Authorization\AuthorizationChecker $securityChecker)
{
$this->securityChecker = $securityChecker;
}
...
}
services.yml
services:
my_class_service:
class: Acme\DemoBundle\MyClass
arguments:
- @security.authorization_checker