2014-10-03 3 views
0

В моем приложении используется веб-сервис , чтобы проверить правильность имени пользователя и пароля. Я просто отправить имя пользователя и пароль из формы авторизации в простой форме, как это:Аутентификация Symfony2 с использованием webservice

https://host/check?user=admin&password=12345"

вебсервиса находится на другом сервере, и он доступен только из приложения также связь шифруется.

После аутентификации вебсервис возвращает всю информацию, которая мне нужна о пользователе (имя, адрес электронной почты и т. Д.), Поэтому из-за этого я ничего не сохраняю в базе данных.

В symfony 1 это было очень легко сделать, но я вижу, что элемент безопасности symfony 2 любит усложнять вещи.

Каков наилучший подход для реализации такого рода аутентификации в symfony 2?

Спасибо

ответ

2

Я считаю, что то, что вы хотите сделать, имеет собственную страницу в документации. Взгляните на How to create a custom user provider, он дает хорошее пошаговое руководство, как вы можете использовать веб-сервис для аутентификации вашего пользователя.

UPDATE:

Да, ссылка я делил говорит вам, как создать пользователя поставщика. И это именно то, что вы должны сделать. В самом первом абзаце этой страницы говорится:

Когда пользователь отправляет имя пользователя и пароль, уровень аутентификации запрашивает у настроенного провайдера пользователя возврат пользовательского объекта для данного имени пользователя.

Так что вам нужно создать класс, который расширяет UserInterface, и этот класс должен иметь все свойства, которые возвращаются из вашего веб-сервиса (также по умолчанию, пользовательским интерфейсом требуется несколько свойств, таких как имя пользователя, пароль , соль и роли. Но соль и роли могут быть пустыми, если вы их не используете).

Затем вы создаете поставщика услуг, который реализует UserProviderInterface. Это приведет к тому, что функция loadUserByUsername вызывается при выполнении логина. В этой функции вы выполняете свой запрос webservice, отправляя учетные данные. Затем ответ вашего запроса можно сопоставить с вашим классом User, который вы создали. Затем вы возвращаете объект User, который вы создали, с данными, которые были возвращены из вашего веб-сервиса.

Для того, чтобы Symfony узнала, что вы хотите использовать свой пользовательский поставщик для входа в форму, вам необходимо создать службу для вашего провайдера. Таким образом, в src/Acme/WebserviceUserBundle/Resources/config/services.yml (возможно, потребуется создать файл), вы можете добавить услугу, как это описывается в документации:

parameters: 
    # path to the user provider you just created 
    webservice_user_provider.class: Acme\WebserviceUserBundle\Security\User\WebserviceUserProvider 

services: 
    webservice_user_provider: 
     class: "%webservice_user_provider.class%" 

После того, как вы создали этот сервис, то вы просто скажите форму входа, чтобы использовать этот обычай поставщик. В security.yml:

security: 
    providers: 
     webservice: 
      # this id is the name of the service you created 
      id: webservice_user_provider 

Кроме того, если ваш пароль зашифрован в вашем веб-сервиса, вы должны убедиться, что Symfony шифрует это один и тот же способ сделать сравнение. Так что в безопасности.yml Вы можете добавить

security: 
    encoders: 
     Acme\WebserviceUserBundle\Security\User\WebserviceUser: sha512 # or md5, or others 
+1

Это показывает, как создать поставщика услуг. Но я должен отправить пароль в веб-сервис, и служба вернет пользовательские данные, если пароль хороший. Поэтому после того, как я позвоню в веб-сервис, мне придется аутентифицировать пользователя. Как пропустить остальные шаги Symfony? – Daniel

+0

Я обновил ответ. Вы должны создать пользовательский поставщик. Это единственный путь. – Sehael

+0

Это дает пользователю закодированный пароль, так что symfony может проверить, совпадает ли он. Но я не могу этого сделать, потому что веб-сервис ожидает пользователя и пароль, предоставленные пользователем. Я должен отправить пользователю и пароль в веб-службу следующим образом: https: // host/check? User = admin & password = 12345, и веб-служба ответит (с данными профиля пользователя), если учетные данные правильные или нет. – Daniel

-1

У меня была такая же проблема с symfony2, и я не понимаю, почему эта структура работает именно так. Очень часто происходит аутентификация с помощью webservice путем предоставления имени пользователя и пароля, и это то, что вы не получаете из коробки в symfony2. Я работал над проблемой, передавая имя пользователя и пароль как одну конкатенированную строку, разделенную специальным разделителем (что-то вроде ## || ##) на метод loadUserByUsername(). Я не помню деталей, но было не сложно изменить части кода, где этот метод вызывается. Поэтому я мог бы позвонить в службу аутентификации webservice в рамках метода loadUserByUsername(), указав имя пользователя и пароль, а при возвращении пользователя разрешите symfony сделать все остальное.

0

На самом деле вам нужен Authentication Provider и используйте защиту WSSE.

Существует множество учебников, объясняющих, как настроить WSSE для Symfony по всему Интернету.

Смежные вопросы