authentification
This commit is contained in:
parent
39d1709b5a
commit
9cf3434d1a
|
@ -3,6 +3,9 @@
|
||||||
use Gist\Service\UserProvider;
|
use Gist\Service\UserProvider;
|
||||||
use Silex\Provider\SecurityServiceProvider;
|
use Silex\Provider\SecurityServiceProvider;
|
||||||
use Gist\Service\SaltGenerator;
|
use Gist\Service\SaltGenerator;
|
||||||
|
use Silex\Provider\SessionServiceProvider;
|
||||||
|
use Gist\Security\AuthentificationProvider;
|
||||||
|
use Gist\Security\AuthentificationListener;
|
||||||
|
|
||||||
$app['salt_generator'] = function ($app) {
|
$app['salt_generator'] = function ($app) {
|
||||||
return new SaltGenerator();
|
return new SaltGenerator();
|
||||||
|
@ -10,32 +13,57 @@ $app['salt_generator'] = function ($app) {
|
||||||
|
|
||||||
$app['user.provider'] = function ($app) {
|
$app['user.provider'] = function ($app) {
|
||||||
return new UserProvider(
|
return new UserProvider(
|
||||||
$app['security.encoder.digest'],
|
$app['security.encoder.digest'],
|
||||||
$app['salt_generator']
|
$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(
|
$app->register(
|
||||||
new SecurityServiceProvider(),
|
new SecurityServiceProvider(),
|
||||||
[
|
[
|
||||||
'security.firewalls' => [
|
'security.firewalls' => [
|
||||||
'default' => [
|
'default' => [
|
||||||
'pattern' => '^/user.*$',
|
'pattern' => '^/[a-z]{2}/my',
|
||||||
'anonymous' => false,
|
'anonymous' => true,
|
||||||
'form' => [
|
'http' => false,
|
||||||
'login_path' => '/login',
|
'form_login' => [
|
||||||
'check_path' => 'login_check',
|
'login_path' => '/login',
|
||||||
|
'check_path' => '/login_check',
|
||||||
],
|
],
|
||||||
'logout' => [
|
'logout' => [
|
||||||
'logout_path' => '/logout'
|
'logout_path' => '/logout'
|
||||||
],
|
],
|
||||||
'users' => $app->share(function() use ($app) {
|
'users' => $app->share(function () use ($app) {
|
||||||
return $app['user.provider'];
|
return $app['user.provider'];
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
'security.access_rules' => [
|
'security.access_rules' => [
|
||||||
['^/user.*$', 'ROLE_USER'],
|
['^/[a-z]{2}/my.*$', 'ROLE_USER'],
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
|
@ -26,10 +26,26 @@ download:
|
||||||
path: /download/{gist}/{commit}
|
path: /download/{gist}/{commit}
|
||||||
defaults: {_controller: Gist\Controller\ViewController::downloadAction, _locale: en, commit: 0}
|
defaults: {_controller: Gist\Controller\ViewController::downloadAction, _locale: en, commit: 0}
|
||||||
|
|
||||||
login_register:
|
register:
|
||||||
path: /login
|
path: /register
|
||||||
defaults: {_controller: Gist\Controller\LoginController::registerAction, _locale: en}
|
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:
|
revisions:
|
||||||
path: /revs/{gist}
|
path: /revs/{gist}
|
||||||
defaults: {_controller: Gist\Controller\ViewController::revisionsAction, _locale: en}
|
defaults: {_controller: Gist\Controller\ViewController::revisionsAction, _locale: en}
|
||||||
|
|
|
@ -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>'
|
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:
|
||||||
|
login:
|
||||||
|
title: 'Login'
|
||||||
|
invalid: 'Invalid username or password.'
|
||||||
|
form:
|
||||||
|
username:
|
||||||
|
placeholder: 'Username'
|
||||||
|
password:
|
||||||
|
placeholder: 'Password'
|
||||||
register:
|
register:
|
||||||
title: 'New account'
|
title: 'New account'
|
||||||
already_exists: 'This username is already registred!'
|
already_exists: 'This username is already registred!'
|
||||||
|
|
|
@ -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>'
|
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:
|
||||||
|
login:
|
||||||
|
title: 'Identification'
|
||||||
|
invalid: 'Nom d''utilisateur ou mot de passe incorrect.'
|
||||||
|
form:
|
||||||
|
username:
|
||||||
|
placeholder: 'Username'
|
||||||
|
password:
|
||||||
|
placeholder: 'Password'
|
||||||
register:
|
register:
|
||||||
title: 'Nouveau compte'
|
title: 'Nouveau compte'
|
||||||
already_exists: 'Ce nom d''utilisateur est déjà enregistré'
|
already_exists: 'Ce nom d''utilisateur est déjà enregistré'
|
||||||
|
|
|
@ -7,6 +7,7 @@ use Symfony\Component\HttpFoundation\Request;
|
||||||
use Silex\Application;
|
use Silex\Application;
|
||||||
use Gist\Model\User;
|
use Gist\Model\User;
|
||||||
use Gist\Form\UserRegisterForm;
|
use Gist\Form\UserRegisterForm;
|
||||||
|
use Gist\Form\UserLoginForm;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class LoginController
|
* 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 : '',
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
20
src/Gist/Controller/MyController.php
Normal file
20
src/Gist/Controller/MyController.php
Normal 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';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ abstract class AbstractForm
|
||||||
{
|
{
|
||||||
$this->translator = $translator;
|
$this->translator = $translator;
|
||||||
|
|
||||||
$this->builder = $formFactory->createBuilder('form', $data, $formFactoryOptions);
|
$this->builder = $formFactory->createNamedBuilder($this->getName(), 'form', $data, $formFactoryOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getForm()
|
public function getForm()
|
||||||
|
@ -27,5 +27,10 @@ abstract class AbstractForm
|
||||||
return $this->builder->getForm();
|
return $this->builder->getForm();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getName()
|
||||||
|
{
|
||||||
|
return 'form';
|
||||||
|
}
|
||||||
|
|
||||||
abstract public function build(array $options = array());
|
abstract public function build(array $options = array());
|
||||||
}
|
}
|
||||||
|
|
57
src/Gist/Form/UserLoginForm.php
Normal file
57
src/Gist/Form/UserLoginForm.php
Normal 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 '';
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,4 +11,9 @@ class User extends BaseUser implements UserInterface
|
||||||
{
|
{
|
||||||
$this->setPassword(null);
|
$this->setPassword(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getRoles()
|
||||||
|
{
|
||||||
|
return explode(',', parent::getRoles());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
42
src/Gist/Resources/views/Login/login.html.twig
Normal file
42
src/Gist/Resources/views/Login/login.html.twig
Normal 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 %}
|
|
@ -4,10 +4,6 @@
|
||||||
{{ 'login.register.title'|trans }}
|
{{ 'login.register.title'|trans }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block langs %}
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
{% if error %}
|
{% if error %}
|
||||||
|
@ -25,7 +21,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% 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="col-md-12">
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
|
|
|
@ -106,6 +106,6 @@ class UserProvider implements UserProviderInterface
|
||||||
|
|
||||||
public function supportsClass($class)
|
public function supportsClass($class)
|
||||||
{
|
{
|
||||||
return $class === 'Gist\\Model\\User';
|
return $class === 'Gist\Model\User';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue