diff --git a/app/bootstrap.php.d/70-user.php b/app/bootstrap.php.d/70-user.php index 32b9642..74a01fb 100644 --- a/app/bootstrap.php.d/70-user.php +++ b/app/bootstrap.php.d/70-user.php @@ -3,6 +3,9 @@ use Gist\Service\UserProvider; use Silex\Provider\SecurityServiceProvider; use Gist\Service\SaltGenerator; +use Silex\Provider\SessionServiceProvider; +use Gist\Security\AuthentificationProvider; +use Gist\Security\AuthentificationListener; $app['salt_generator'] = function ($app) { return new SaltGenerator(); @@ -10,32 +13,57 @@ $app['salt_generator'] = function ($app) { $app['user.provider'] = function ($app) { return new UserProvider( - $app['security.encoder.digest'], + $app['security.encoder.digest'], $app['salt_generator'] ); }; +$app->register(new SessionServiceProvider()); + + +$app['security.authentication_listener.factory.form_login'] = $app->protect(function ($name, $options) use ($app) { + $app['security.authentication_provider.'.$name.'.form_login'] = $app->share(function ($app) { + return new AuthentificationProvider($app['user.provider']); + }); + + $app['security.authentication_listener.'.$name.'.form_login'] = $app->share(function ($app) { + return new AuthentificationListener( + $app['security.token_storage'], + $app['security.authentication_manager'], + $app['url_generator'] + ); + }); + + return [ + 'security.authentication_provider.'.$name.'.form_login', + 'security.authentication_listener.'.$name.'.form_login', + null, + 'pre_auth' + ]; +}); + $app->register( - new SecurityServiceProvider(), + new SecurityServiceProvider(), [ 'security.firewalls' => [ 'default' => [ - 'pattern' => '^/user.*$', - 'anonymous' => false, - 'form' => [ - 'login_path' => '/login', - 'check_path' => 'login_check', + 'pattern' => '^/[a-z]{2}/my', + 'anonymous' => true, + 'http' => false, + 'form_login' => [ + 'login_path' => '/login', + 'check_path' => '/login_check', ], 'logout' => [ 'logout_path' => '/logout' ], - 'users' => $app->share(function() use ($app) { + 'users' => $app->share(function () use ($app) { return $app['user.provider']; }), ], ], 'security.access_rules' => [ - ['^/user.*$', 'ROLE_USER'], + ['^/[a-z]{2}/my.*$', 'ROLE_USER'], ] ] ); diff --git a/app/config/routing.yml b/app/config/routing.yml index eff74d4..ad019b9 100644 --- a/app/config/routing.yml +++ b/app/config/routing.yml @@ -26,10 +26,26 @@ download: path: /download/{gist}/{commit} defaults: {_controller: Gist\Controller\ViewController::downloadAction, _locale: en, commit: 0} -login_register: - path: /login +register: + path: /register defaults: {_controller: Gist\Controller\LoginController::registerAction, _locale: en} +_login: + path: /login + defaults: {_controller: Gist\Controller\LoginController::loginAction, _locale: en} + +_login_check: + path: /my/login_check + defaults: {_locale: en} + +_logout: + path: /my/logout + defaults: {_locale: en} + +my: + path: /my + defaults: {_controller: Gist\Controller\MyController::myAction, _locale: en} + revisions: path: /revs/{gist} defaults: {_controller: Gist\Controller\ViewController::revisionsAction, _locale: en} diff --git a/app/locales/en.yml b/app/locales/en.yml index f9ffa13..6ca5efc 100644 --- a/app/locales/en.yml +++ b/app/locales/en.yml @@ -28,6 +28,14 @@ footer: text: '

Powered by GIST, it''s open source :) - API

' login: + login: + title: 'Login' + invalid: 'Invalid username or password.' + form: + username: + placeholder: 'Username' + password: + placeholder: 'Password' register: title: 'New account' already_exists: 'This username is already registred!' diff --git a/app/locales/fr.yml b/app/locales/fr.yml index aa6c8b7..53178cd 100644 --- a/app/locales/fr.yml +++ b/app/locales/fr.yml @@ -28,6 +28,14 @@ footer: text: '

Propulsé par GIST, c''est libre :) - API

' login: + login: + title: 'Identification' + invalid: 'Nom d''utilisateur ou mot de passe incorrect.' + form: + username: + placeholder: 'Username' + password: + placeholder: 'Password' register: title: 'Nouveau compte' already_exists: 'Ce nom d''utilisateur est déjà enregistré' diff --git a/src/Gist/Controller/LoginController.php b/src/Gist/Controller/LoginController.php index 33e2cac..11aafa9 100644 --- a/src/Gist/Controller/LoginController.php +++ b/src/Gist/Controller/LoginController.php @@ -7,6 +7,7 @@ use Symfony\Component\HttpFoundation\Request; use Silex\Application; use Gist\Model\User; use Gist\Form\UserRegisterForm; +use Gist\Form\UserLoginForm; /** * Class LoginController @@ -52,5 +53,31 @@ class LoginController extends Controller ] ); } + + public function loginAction(Request $request, Application $app) + { + $user = $app['user.provider']->createUser(); + + $form = new UserLoginForm( + $app['form.factory'], + $app['translator'], + $user, + ['csrf_protection' => false] + ); + + $form = $form->build()->getForm(); + + if ($request->isMethod('post')) { + $error = $app['translator']->trans('login.login.invalid'); + } + + return $app['twig']->render( + 'Login/login.html.twig', + [ + 'form' => $form->createView(), + 'error' => isset($error) ? $error : '', + ] + ); + } } diff --git a/src/Gist/Controller/MyController.php b/src/Gist/Controller/MyController.php new file mode 100644 index 0000000..3a6fc1b --- /dev/null +++ b/src/Gist/Controller/MyController.php @@ -0,0 +1,20 @@ + + */ +class MyController extends Controller +{ + public function myAction(Request $request, Application $app) + { + return 'test'; + } +} + diff --git a/src/Gist/Form/AbstractForm.php b/src/Gist/Form/AbstractForm.php index 05d5c78..16db215 100644 --- a/src/Gist/Form/AbstractForm.php +++ b/src/Gist/Form/AbstractForm.php @@ -19,7 +19,7 @@ abstract class AbstractForm { $this->translator = $translator; - $this->builder = $formFactory->createBuilder('form', $data, $formFactoryOptions); + $this->builder = $formFactory->createNamedBuilder($this->getName(), 'form', $data, $formFactoryOptions); } public function getForm() @@ -27,5 +27,10 @@ abstract class AbstractForm return $this->builder->getForm(); } + public function getName() + { + return 'form'; + } + abstract public function build(array $options = array()); } diff --git a/src/Gist/Form/UserLoginForm.php b/src/Gist/Form/UserLoginForm.php new file mode 100644 index 0000000..25ec5ac --- /dev/null +++ b/src/Gist/Form/UserLoginForm.php @@ -0,0 +1,57 @@ + + */ +class UserLoginForm extends AbstractForm +{ + public function build(array $options = array()) + { + $this->builder->add( + '_username', + 'text', + array( + 'required' => true, + 'attr' => array( + 'class' => 'form-control', + 'placeholder' => $this->translator->trans('login.register.form.username.placeholder'), + ), + 'constraints' => array( + new NotBlank(array( + 'message' => $this->translator->trans('form.error.not_blank'), + )), + ), + ) + ); + + $this->builder->add( + '_password', + 'password', + array( + 'required' => true, + 'attr' => array( + 'class' => 'form-control', + 'placeholder' => $this->translator->trans('login.register.form.password.placeholder'), + ), + 'trim' => false, + 'constraints' => array( + new NotBlank(array( + 'message' => $this->translator->trans('form.error.not_blank'), + )), + ), + ) + ); + + return $this->builder; + } + + public function getName() + { + return ''; + } +} diff --git a/src/Gist/Model/User.php b/src/Gist/Model/User.php index 7fd1cc5..4702421 100644 --- a/src/Gist/Model/User.php +++ b/src/Gist/Model/User.php @@ -11,4 +11,9 @@ class User extends BaseUser implements UserInterface { $this->setPassword(null); } + + public function getRoles() + { + return explode(',', parent::getRoles()); + } } diff --git a/src/Gist/Resources/views/Login/login.html.twig b/src/Gist/Resources/views/Login/login.html.twig new file mode 100644 index 0000000..ae09fc6 --- /dev/null +++ b/src/Gist/Resources/views/Login/login.html.twig @@ -0,0 +1,42 @@ +{% extends 'base.html.twig' %} + +{% block title %} + {{ 'login.login.title'|trans }} +{% endblock %} + +{% block body %} +
+ {% if error %} +
+
+ {{ error }} +
+
+ {% endif %} + +
+
+
+
+ {{ 'login.login.title'|trans }} +
+
+

+ {{ form_errors(form._username) }} + {{ form_widget(form._username) }} +

+ +

+ {{ form_errors(form._password) }} + {{ form_widget(form._password) }} +

+ +

+ +

+
+
+
+
+
+{% endblock %} diff --git a/src/Gist/Resources/views/Login/register.html.twig b/src/Gist/Resources/views/Login/register.html.twig index 12b8abd..0650bff 100644 --- a/src/Gist/Resources/views/Login/register.html.twig +++ b/src/Gist/Resources/views/Login/register.html.twig @@ -4,10 +4,6 @@ {{ 'login.register.title'|trans }} {% endblock %} -{% block langs %} - -{% endblock %} - {% block body %}
{% if error %} @@ -25,7 +21,7 @@
{% else %} -
+
diff --git a/src/Gist/Service/UserProvider.php b/src/Gist/Service/UserProvider.php index 2cca08c..c6db82e 100644 --- a/src/Gist/Service/UserProvider.php +++ b/src/Gist/Service/UserProvider.php @@ -106,6 +106,6 @@ class UserProvider implements UserProviderInterface public function supportsClass($class) { - return $class === 'Gist\\Model\\User'; + return $class === 'Gist\Model\User'; } }