Форма входа в веб-сервис Symfony 3.3 - PullRequest
0 голосов
/ 16 мая 2018

Мы работаем в форме входа в систему, используя simfony и REST Webservice. Мы искали по этой ссылке (http://symfony.com/doc/current/security/custom_provider.html)

Цель - войти в систему с помощью формы и веб-службы REST, обновить данные моего сеанса, например, имя, документ, адрес электронной почты и т. Д.

И с этими данными разрешить или запретить доступ к некоторым страницам или функциям.

Когда мы отправляем форму, мы не знаем, как использовать данные, возвращаемые веб-службой, в том числе, если есть ответ или нет.

Это наш код:

SecurityController.php

<?php
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends Controller {
//    public function loginAction(AuthenticationUtils $authenticationUtils) {
    public function loginAction(Request $request, AuthenticationUtils $authenticationUtils) {
//        $authenticationUtils = $this->get('security.authentication_utils');
        $error = $authenticationUtils->getLastAuthenticationError();
        $lastUsername = $authenticationUtils->getLastUsername();
        return $this->render('AppBundle:Security:login.html.twig', array('last_username' => $lastUsername, 'error' => $error));
//        return $this->render('AppBundle:Security:login.html.twig');
    }
    public function loginCheckAction() {
        $ca = $this->get('webservice_user_provider');
        print_r($ca);
        exit;
    }
}

Login.html.twig -----

   <form class="form-signin" action="{{ path('app_user_login_check') }}" method="POST">

security.yml -----------------------

вебсервис: id: webservice_user_provider

Archivo services.yml ----------------------------

  webservice_user_provider:
        class: AppBundle\Security\User\WebserviceUserProvider

WebserviceUserProvider.php -----------------------------

<?php

// src/AppBundle/Security/User/WebserviceUserProvider.php

namespace AppBundle\Security\User;

use AppBundle\Security\User\WebserviceUser;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Unirest;

class WebserviceUserProvider implements UserProviderInterface {

    protected $user;

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

    public function loadUserByUsername($username) {

        // make a call to your webservice here
        print_r("Estoy en el controlador de usuario");
        exit;
        $headers = array('Accept' => 'application/json');
        $password = $this->request->get('password');
        $query = array('user' => $username, 'password' => _password);
        $userData = Unirest\Request::post('http://127.0.0.10:8888/login', $headers, $query);

// pretend it returns an array on success, false if there is no user

        if ($userData) {

            $datos = $userData->raw_body;

//            print_r($userData);
//            print_r($userData->body);
//            print_r($userData->raw_body);

            $username = $datos['ldap']['document'];
            $password = $datos['ldap']['document'];
            $salt = $datos['ldap']['document'];
            $roles = $datos['ldap']['document'];
            $doc = $datos['ldap']['document'];
            $full_name = $datos['ldap']['document'];
            $userLdap = $datos['ldap']['document'];
            $userEpersonal = $datos['ldap']['document'];
            $mail = $datos['ldap']['document'];
            $position = $datos['ldap']['document'];

            return new WebserviceUser($username, $password, $salt, $roles, $documento, $full_name, $userLdap, $userEpersonal, $mail, $position);
        }

        throw new UsernameNotFoundException(
        sprintf('Username "%s" does not exist.', $username)
        );
    }

    public function refreshUser(UserInterface $user) {
        if (!$user instanceof WebserviceUser) {
            throw new UnsupportedUserException(
            sprintf('Instances of "%s" are not supported.', get_class($user))
            );
        }

        return $this->loadUserByUsername($user->getUsername());
    }

    public function supportsClass($class) {
        return WebserviceUser::class === $class;
    }

}

1 Ответ

0 голосов
/ 16 мая 2018

Я дам вам общий обзор, для деталей реализации вы можете задать другой вопрос.

Веб-служба REST не должна иметь состояния, т. Е. (Чтобы немного упростить) не должна иметь сеанса. Для реализации ACL у вас могут быть разные стратегии.

Самый простой способ - выполнить аутентификацию для каждого запроса. Вы можете использовать HTTP-аутентификацию или API-ключ, как это делают многие веб-сервисы. Ваш веб-сервис всегда будет аутентифицировать пользователя в качестве первого шага в каждом запросе.

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

...