2015-09-05 5 views
0

Добрый день, все.Как продлить аутентификацию в OroCRM

Мне нужно расширить механизм аутентификации для моих нужд. Для этого я создал Custom Form Password Authenticator

1) Я изменил настройки брандмауэра

main: 
      ... 
      #organization-form-login: 
      simple_form: 
       authenticator:    my_authenticator 
       csrf_provider:    form.csrf_provider 
       check_path:     oro_user_security_check 
       login_path:     oro_user_security_login 
      ... 

2) Я создал сервис для my_authenticator

services: 
    ... 
    my_authenticator: 
     class:  OQ\SecurityBundle\Security\MyAuthenticator 
     arguments: 
      - @oro_organization.organization_manager 
    ... 

3) А вот код MyAuthenticator

namespace OQ\SecurityBundle\Security; 

use Symfony\Component\Config\Definition\Exception\Exception; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\Security\Core\Authentication\SimpleFormAuthenticatorInterface; 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; 
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; 
use Symfony\Component\Security\Core\Exception\AuthenticationException; 
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; 
use Symfony\Component\Security\Core\User\UserProviderInterface; 
Use Oro\Bundle\SecurityBundle\Authentication\Token\UsernamePasswordOrganizationToken; 
use Oro\Bundle\OrganizationBundle\Entity\Manager\OrganizationManager; 

class MyAuthenticator implements SimpleFormAuthenticatorInterface 
{ 
    /** @var OrganizationManager */ 
    protected $manager; 

    public function __construct(OrganizationManager $manager) 
    { 
     $this->manager = $manager; 
    } 

    public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey) 
    { 

     // Here will be my special checks 

     //Here i try to get username and force authentication 

     try { 
      $user = $userProvider->loadUserByUsername($token->getUsername()); 
     } catch (UsernameNotFoundException $e) { 
      throw new AuthenticationException('This user not allowed'); 
     } 

     // If everythin' is ok - create a token 
     if ($user) { 
      return new UsernamePasswordOrganizationToken(
       $user, 
       $user->getPassword(), 
       $providerKey, 
       $this->manager->getOrganizationById(1) 
      ); 
     } else { 
      throw new AuthenticationException('Invalid username or password'); 
     } 


    } 

    public function supportsToken(TokenInterface $token, $providerKey) 
    { 
     return $token instanceof UsernamePasswordOrganizationToken 
     && $token->getProviderKey() === $providerKey; 
    } 

    public function createToken(Request $request, $username, $password, $providerKey) 
    { 
     //UsernamePasswordOrganizationToken 
     return new UsernamePasswordOrganizationToken($username, $password, $providerKey, $this->manager->getOrganizationById(1)); 
    } 
} 

Когда я пытаюсь аутентифицировать нас er - i успешно войти в систему, но я не вижу ничего, кроме черного заголовка и профилировщика. Профилер говорит мне, что я зарегистрирован как USER_NAME (желтый цвет) и не аутентифицирован (красный цвет). Можете ли вы дать мне совет - как сделать работу? И еще один вопрос - как я могу получить организацию пользователя в этом классе аутентификации?

ответ

3

Если вы проверяете UsernamePasswordToken конструктор вы увидите это требует, чтобы передать $ роли для того, чтобы сделать его подлинности parent::setAuthenticated(count($roles) > 0);

И это невозможно изменить флаг AUTHENTICATE после в setAuthenticated (см код, почему).

Проверьте также класс UserAuthenticationProvider, чтобы получить представление о том, что происходит.

Надеюсь, это поможет.

+0

ThatsIt! Я не указал роль пользователя, потому что этот параметр является необязательным в UsernamePasswordOrganizationToken. Теперь он работает, спасибо! –