【问题标题】:How to extend authentication in OroCRM如何在 OroCRM 中扩展身份验证
【发布时间】:2015-12-01 06:05:36
【问题描述】:

大家好。

我需要扩展身份验证机制以满足我的需要。 为此,我创建了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));
    }
}

当我尝试验证用户身份时 - 我成功登录,但除了黑色标头和探查器外,我什么也没看到。 Profiler 告诉我,我登录为 USER_NAME(黄色),并且未通过身份验证(红色)。 你能给我一个建议 - 如何让它工作吗? 还有一个问题 - 我如何在这个身份验证器类中检索用户的组织?

【问题讨论】:

    标签: symfony orocrm


    【解决方案1】:

    如果您检查 UsernamePasswordToken 构造函数,您会看到它需要您传递 $roles 才能使其通过身份验证 parent::setAuthenticated(count($roles) > 0);

    并且在 setAuthenticated 之后无法更改身份验证标志(请参阅代码原因)。

    还要检查 UserAuthenticationProvider 类以了解发生了什么。

    我希望这会有所帮助。

    【讨论】:

    • 就是这样!我没有指定用户角色,因为这个参数在 UsernamePasswordOrganizationToken 中是可选的。现在可以了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-06-22
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2019-02-06
    相关资源
    最近更新 更多