Как создать собственный User-Provider для symfony2? - PullRequest
1 голос
/ 03 августа 2011

Я новичок в Symfony и php5 (я Java, Spring, разработчик Grails).

Я работаю над проектом, у которого есть java-middleware и PHP-интерфейс с Symfony 2. Промежуточное программное обеспечение Java хранит пользователей и все, что нужно моему приложению.

Я не хочу, чтобы у symfony2 была собственная база данных. Вся необходимая информация для symfony2 поступает из java-middleware через WSDL и моего php-soap-api, который я могу включить в мой проект symfony2.

Пользователи должны войти в веб-интерфейс. Поэтому я должен написать функциональность входа и выхода. Java-middleware предоставляет метод входа в систему, который я могу вызвать в php через php-soap-api.

Как мне реализовать функцию входа / выхода из системы в symfony2? Должен ли я реализовать пользовательский провайдер, который вызывает php-soap-api? Если да, как я могу это сделать? (http://symfony.com/doc/2.0/cookbook/security/custom_provider.html) недоступно.

Спасибо за поддержку! whitenexx

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

Да, вам нужно будет создать своего собственного провайдера и добавить его в качестве службы в приложение Symfony.Создаваемый вами класс провайдера пользователя должен реализовывать UserProviderInterface

. Для начала ваш класс приведен в качестве примера моего пользовательского класса, расположенного в пространстве имен / Bundle / Security / Provider.php:

namespace CB\WebsiteBundle\Security;

use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;

use CB\WebsiteBundle\Entity\User;

class Provider implements UserProviderInterface {

    protected $user;
    public function __contsruct (UserInterface $user) {
        $this->user = $user;
    }

    /**
     * Loads the user for the given username.
     *
     * This method must throw UsernameNotFoundException if the user is not
     * found.
     *
     * @throws UsernameNotFoundException if the user is not found
     * @param string $username The username
     *
     * @return UserInterface
     */
    function loadUserByUsername($username) {
        $user = User::find(array('username'=>$username));
        if(empty($user)){
            throw new UsernameNotFoundException('Could not find user. Sorry!');
        }
        $this->user = $user;
        return $user;
    }

    /**
     * Refreshes the user for the account interface.
     *
     * It is up to the implementation if it decides to reload the user data
     * from the database, or if it simply merges the passed User into the
     * identity map of an entity manager.
     *
     * @throws UnsupportedUserException if the account is not supported
     * @param UserInterface $user
     *
     * @return UserInterface
     */
    function refreshUser(UserInterface $user) {
        return $user;
    }

    /**
     * Whether this provider supports the given user class
     *
     * @param string $class
     *
     * @return Boolean
     */
    function supportsClass($class) {
        return $class === 'MC\WebsiteBundle\Entity\User';
    }
}

Некоторые ключевые вещи, которые следует отметить в этом классе, это то, что он использует пользовательскую сущность User, которую вы определяете сами, что облегчит подключение к промежуточному программному обеспечению Java.В моем случае я подключаюсь к REST API, чтобы получить информацию о моем пользователе, и мой пользовательский класс использует статическую функцию User :: find ($ critisates) для поиска пользователей по имени пользователя.

Как только у вас есть собственный пользователькласс, который взаимодействует с вашим промежуточным программным обеспечением, и у вас есть новый провайдер, вам нужно добавить провайдера в качестве сервиса в конфигурацию вашего пакета: YourBundle / Resources / config.xml:

<parameters>
    <parameter key="cb_security_user.class">CB\WebsiteBundle\Entity\User</parameter>
    <parameter key="cb_security_provider.class">CB\WebsiteBundle\Security\Provider</parameter>
</parameters>

<services>
    <service id="cb_security_user" class="%cb_security_user.class%" />
    <service id="cb_security_provider" class="%cb_security_provider.class%">
        <argument type="service" id="cb_security_user" />
    </service>
</services>

Вы можете найти более подробную информациюв моем блоге здесь: Пользовательские провайдеры в Symfony2

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

1 голос
/ 05 августа 2011

Ознакомьтесь с документацией User Provider Interface ... Я думаю, что один из способов - это создать собственную реализацию интерфейса, которая будет выполнять функцию оболочки для вызовов WSDL, а затем правильно настроить вашу безопасностьконтекст ( security.yml ), чтобы использовать его.

У меня похожая проблема, и я тоже пытаюсь создать свой собственный пользовательский провайдер.

...