authentification

This commit is contained in:
Simon Vieille 2015-11-21 18:28:48 +01:00
parent 39d1709b5a
commit 9cf3434d1a
12 changed files with 230 additions and 18 deletions

View file

@ -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'],
]
]
);

View file

@ -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}

View file

@ -28,6 +28,14 @@ footer:
text: '<p>Powered by <a href="https://gitlab.deblan.org/deblan/gist">GIST</a>, it''s open source :) - <a href="https://gitlab.deblan.org/deblan/gist#api">API</a></p>'
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!'

View file

@ -28,6 +28,14 @@ footer:
text: '<p>Propulsé par <a href="https://gitlab.deblan.org/deblan/gist">GIST</a>, c''est libre :) - <a href="https://gitlab.deblan.org/deblan/gist#api">API</a></p>'
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é'

View file

@ -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 : '',
]
);
}
}

View file

@ -0,0 +1,20 @@
<?php
namespace Gist\Controller;
use Gist\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Silex\Application;
/**
* Class MyController
* @author Simon Vieille <simon@deblan.fr>
*/
class MyController extends Controller
{
public function myAction(Request $request, Application $app)
{
return 'test';
}
}

View file

@ -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());
}

View file

@ -0,0 +1,57 @@
<?php
namespace Gist\Form;
use Symfony\Component\Validator\Constraints\NotBlank;
/**
* Class UserLoginForm
* @author Simon Vieille <simon@deblan.fr>
*/
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 '';
}
}

View file

@ -11,4 +11,9 @@ class User extends BaseUser implements UserInterface
{
$this->setPassword(null);
}
public function getRoles()
{
return explode(',', parent::getRoles());
}
}

View file

@ -0,0 +1,42 @@
{% extends 'base.html.twig' %}
{% block title %}
{{ 'login.login.title'|trans }}
{% endblock %}
{% block body %}
<div class="row">
{% if error %}
<div class="col-md-12">
<div class="alert alert-warning">
{{ error }}
</div>
</div>
{% endif %}
<form action="{{ path('_login_check') }}" method="post" id="main-form">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-heading">
{{ 'login.login.title'|trans }}
</div>
<div class="panel-body">
<p>
{{ form_errors(form._username) }}
{{ form_widget(form._username) }}
</p>
<p>
{{ form_errors(form._password) }}
{{ form_widget(form._password) }}
</p>
<p>
<input type="submit" class="btn btn-primary" value="{{ 'form.submit'|trans }}">
</p>
</div>
</div>
</div>
</form>
</div>
{% endblock %}

View file

@ -4,10 +4,6 @@
{{ 'login.register.title'|trans }}
{% endblock %}
{% block langs %}
{% endblock %}
{% block body %}
<div class="row">
{% if error %}
@ -25,7 +21,7 @@
</div>
</div>
{% else %}
<form action="{{ path('login_register') }}" method="post" id="main-form">
<form action="{{ path('register') }}" method="post" id="main-form">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-heading">

View file

@ -106,6 +106,6 @@ class UserProvider implements UserProviderInterface
public function supportsClass($class)
{
return $class === 'Gist\\Model\\User';
return $class === 'Gist\Model\User';
}
}