Commit 6af09360 authored by tguillon's avatar tguillon
Browse files

Mise en place de la page de configuration de connexion à un LDAP par entitée.

Connection avec un login/password LDAP --> fonctionnelle
parent f6af066d
......@@ -31,6 +31,7 @@
/app/files/modeles
/app/files/piece_joint_traitement
/app/files/registre
/app/files/connecteurs
# OS generated files #
######################
......
......@@ -399,6 +399,54 @@ CREATE TABLE traitement_registres
modified timestamp without time zone NOT NULL
);
--
-- Création de la table ldaps
--
CREATE TABLE connecteur_ldaps (
id SERIAL NOT NULL PRIMARY KEY,
organisation_id INTEGER NOT NULL REFERENCES organisations (id) ON DELETE CASCADE ON UPDATE CASCADE,
use BOOLEAN NOT NULL DEFAULT FALSE,
type VARCHAR(15) NOT NULL,
host VARCHAR(100) NOT NULL,
host_fall_over VARCHAR(100) NOT NULL,
port INTEGER NOT NULL,
login VARCHAR(50) NOT NULL,
password VARCHAR(100) NOT NULL,
basedn VARCHAR(100) NOT NULL,
tls BOOLEAN NOT NULL DEFAULT FALSE,
version INTEGER NOT NULL,
account_suffix VARCHAR(100),
username VARCHAR(100),
note VARCHAR(100),
nom VARCHAR(100),
prenom VARCHAR(100),
email VARCHAR(100),
telfixe VARCHAR(100),
telmobile VARCHAR(100),
active VARCHAR(100)
);
CREATE UNIQUE INDEX connecteur_ldaps_organisation_id_idx ON connecteur_ldaps (organisation_id);
ALTER TABLE connecteur_ldaps ADD CONSTRAINT connecteur_ldaps_type_in_list_chk CHECK (cakephp_validate_in_list(type, ARRAY['ActiveDirectory', 'OpenLDAP']));
ALTER TABLE connecteur_ldaps ADD CONSTRAINT connecteur_ldaps_version_in_list_chk CHECK (cakephp_validate_in_list(version, ARRAY[1,2,3]));
--
-- Création de la table authentifications
--
CREATE TABLE authentifications (
id SERIAL NOT NULL PRIMARY KEY,
organisation_id INTEGER NOT NULL REFERENCES organisations (id) ON DELETE CASCADE ON UPDATE CASCADE,
use BOOLEAN NOT NULL DEFAULT FALSE,
type VARCHAR(4) NOT NULL,
serveur VARCHAR(100),
port INTEGER,
uri VARCHAR(100),
name_fichier VARCHAR
);
CREATE UNIQUE INDEX authentifications_organisation_id_idx ON authentifications (organisation_id);
ALTER TABLE authentifications ADD CONSTRAINT ldaps_type_in_list_chk CHECK (cakephp_validate_in_list(type, ARRAY['CAS', 'LDAP']));
-- INFO: voir http://postgresql.developpez.com/sources/?page=chaines
CREATE OR REPLACE FUNCTION "public"."noaccents_upper" (text) RETURNS text AS
$body$
......
......@@ -39,6 +39,12 @@ define('CHEMIN_REGISTRE', APP . FICHIER . REGISTRE . DS);
define('NORMES', DS . "normes");
define('CHEMIN_NORMES', APP . FICHIER . NORMES . DS);
//Dossier qui va contenir toutes les certificats pour les connecteurs
define('CONNECTEURS', DS . "connecteurs");
define('CHEMIN_CONNECTEURS', APP . FICHIER . CONNECTEURS . DS);
define('AUTHENTIFICATION', DS . "authentifications");
define('CHEMIN_CONNECTEURS_AUTHENTIFICATION', APP . FICHIER . CONNECTEURS . AUTHENTIFICATION . DS);
//Format des dates et heures
define('FORMAT_DATE', '%e-%m-%Y');
define('FORMAT_DATE_HEURE', '%e-%m-%Y à %H:%M');
......
......@@ -44,6 +44,13 @@ class AppController extends Controller
'Droits',
'Notifications',
'Auth' => [
'loginAction' => [
'admin' => false,
'plugin' => null,
'controller' => 'users',
'action' => 'login'
],
'authError' => 'Vous n\'êtes pas autorisé à effectuer cette action !',
'loginRedirect' => [
'controller' => 'organisations',
'action' => 'change'
......@@ -53,7 +60,32 @@ class AppController extends Controller
'controller' => 'pages',
'action' => 'display',
'home'
]
],
'authenticate' => [
//Paramètre à passer pour tous les objets d'authentifications
'all' => [
'userModel' => 'User'
],
/* 'AuthManager.Cas' => [
'loginAction' => [
'admin' => false,
'plugin' => null,
'controller' => 'users',
'action' => 'casLogin'
],
'logoutRedirect' => [
'admin' => false,
'plugin' => null,
'controller' => 'users',
'action' => 'casLogout'
],
'except' => ['admin']
],*/
'AuthManager.Ldap' => [
'except' => ['superadmin']
],
'Form'
]
],
'Translator.TranslatorAutoload' => [
'translatorClass' => 'WebcilTranslator'
......
<?php
/**
* AuthentificationsController
*
* web-DPO : Outil de gestion de vos traitements dans le cadre de la
* réglementation relative à la protection des données personnelles (RGPD)
*
* Copyright (c) Libriciel SCOP (https://www.libriciel.fr/)
*
* Licensed under The CeCiLL V2 License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Libriciel SCOP (https://www.libriciel.fr/)
* @link https://www.libriciel.fr/web-cil/
* @since web-DPO v1.0.0
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html CeCiLL V2 License
* @version v1.0.0
* @package App.Controller
*/
App::uses('ListeDroit', 'Model');
class AuthentificationsController extends AppController {
public $uses = [
'Authentification'
];
/**
* Permets l'ajout et la modification du connecteur LDAP
*
* @author Théo GUILLON <theo.guillon@libriciel.coop>
* @access public
* @created 20/03/2018
* @version V1.0.0
*/
public function add() {
if (true !== $this->Droits->authorized($this->Droits->isSu() || [ListeDroit::CREER_UTILISATEUR, ListeDroit::MODIFIER_UTILISATEUR, ListeDroit::SUPPRIMER_UTILISATEUR, ListeDroit::CREER_ORGANISATION, ListeDroit::MODIFIER_ORGANISATION, ListeDroit::CREER_PROFIL, ListeDroit::MODIFIER_PROFIL, ListeDroit::SUPPRIMER_PROFIL])) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->set('title', __d('authentification', 'authentification.titreAuthentification'));
$this->set('options', $this->Authentification->enums());
if ($this->request->is('post') || $this->request->is('put')) {
if ('Cancel' === Hash::get($this->request->data, 'submit')) {
$this->redirect([
'controller' => 'connecteurs',
'action' => 'index'
]);
}
$success = true;
$this->Authentification->begin();
if (!empty($this->request->data['Authentification']['name_fichier'])) {
$file = $this->request->data['Authentification']['name_fichier'];
}
$this->request->data['Authentification']['name_fichier'] = null;
$this->request->data['Authentification']['organisation_id'] = $this->Session->read('Organisation.id');
$this->Authentification->create($this->request->data);
$success = $success && false !== $this->Authentification->save();
if (!empty($file)) {
$saveFile = $this->Authentification->saveFile($file, $this->request->data['Authentification']['id']);
}
if ($success === true) {
$this->Authentification->commit();
$this->Session->setFlash(__d('authentification', 'authentification.flashsuccessConnecteurEnregistrer'), 'flashsuccess');
$this->redirect([
'controller' => 'connecteurs',
'action' => 'index'
]);
} else {
$this->Authentification->rollback();
$this->Session->setFlash(__d('authentification', 'authentification.flasherrorErreurEnregistrementConnecteur'), 'flasherror');
}
} else {
$query = [
'conditions' => [
'organisation_id' => $this->Session->read('Organisation.id')
]
];
$this->request->data = $this->Authentification->find('first', $query);
}
}
}
<?php
/**
* ConnecteurLdapsController
*
* web-DPO : Outil de gestion de vos traitements dans le cadre de la
* réglementation relative à la protection des données personnelles (RGPD)
*
* Copyright (c) Libriciel SCOP (https://www.libriciel.fr/)
*
* Licensed under The CeCiLL V2 License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Libriciel SCOP (https://www.libriciel.fr/)
* @link https://www.libriciel.fr/web-cil/
* @since web-DPO v1.0.0
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html CeCiLL V2 License
* @version v1.0.0
* @package App.Controller
*/
App::uses('ListeDroit', 'Model');
class ConnecteurLdapsController extends AppController {
public $uses = [
'ConnecteurLdap'
];
/**
* Permets l'ajout et la modification du connecteur LDAP
*
* @author Théo GUILLON <theo.guillon@libriciel.coop>
* @access public
* @created 20/03/2018
* @version V1.0.0
*/
public function add() {
if (true !== $this->Droits->authorized($this->Droits->isSu() || [ListeDroit::CREER_UTILISATEUR, ListeDroit::MODIFIER_UTILISATEUR, ListeDroit::SUPPRIMER_UTILISATEUR, ListeDroit::CREER_ORGANISATION, ListeDroit::MODIFIER_ORGANISATION, ListeDroit::CREER_PROFIL, ListeDroit::MODIFIER_PROFIL, ListeDroit::SUPPRIMER_PROFIL])) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->set('title', __d('connecteur_ldap', 'connecteur_ldap.titreLdap'));
$this->set('options', $this->ConnecteurLdap->enums());
if ($this->request->is('post') || $this->request->is('put')) {
if ('Cancel' === Hash::get($this->request->data, 'submit')) {
$this->redirect([
'controller' => 'connecteurs',
'action' => 'index'
]);
}
$success = true;
$this->ConnecteurLdap->begin();
$this->request->data['ConnecteurLdap']['organisation_id'] = $this->Session->read('Organisation.id');
$this->ConnecteurLdap->create($this->request->data);
$success = $success && false !== $this->ConnecteurLdap->save();
if ($success === true) {
$this->ConnecteurLdap->commit();
$this->Session->setFlash(__d('connecteur_ldap', 'connecteur_ldap.flashsuccessConnecteurEnregistrer'), 'flashsuccess');
$this->redirect([
'controller' => 'connecteurs',
'action' => 'index'
]);
} else {
$this->ConnecteurLdap->rollback();
$this->Session->setFlash(__d('connecteur_ldap', 'connecteur_ldap.flasherrorErreurEnregistrementConnecteur'), 'flasherror');
}
} else {
$query = [
'conditions' => [
'organisation_id' => $this->Session->read('Organisation.id')
]
];
$this->request->data = $this->ConnecteurLdap->find('first', $query);
}
}
}
<?php
/**
* ConnecteursController
*
* web-DPO : Outil de gestion de vos traitements dans le cadre de la
* réglementation relative à la protection des données personnelles (RGPD)
*
* Copyright (c) Libriciel SCOP (https://www.libriciel.fr/)
*
* Licensed under The CeCiLL V2 License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Libriciel SCOP (https://www.libriciel.fr/)
* @link https://www.libriciel.fr/web-cil/
* @since web-DPO v1.0.0
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html CeCiLL V2 License
* @version v1.0.0
* @package App.Controller
*/
App::uses('ListeDroit', 'Model');
class ConnecteursController extends AppController {
private $connecteurs = [
1 => [
'connecteur' => 'LDAP',
'controller' => 'connecteurLdaps',
'action' => 'add'
],
2 => [
'connecteur' => 'Authentification (CAS, LDAP)',
'controller' => 'authentifications',
'action' => 'add'
],
];
/**
* Permet l'affichage de la liste des connecteurs
*
* @throws ForbiddenException
*
* @author Théo GUILLON <theo.guillon@libriciel.coop>
* @access public
* @created 20/03/2018
* @version V1.0.0
*/
public function index() {
if (true !== $this->Droits->authorized($this->Droits->isSu() || [ListeDroit::CREER_UTILISATEUR, ListeDroit::MODIFIER_UTILISATEUR, ListeDroit::SUPPRIMER_UTILISATEUR, ListeDroit::CREER_ORGANISATION, ListeDroit::MODIFIER_ORGANISATION, ListeDroit::CREER_PROFIL, ListeDroit::MODIFIER_PROFIL, ListeDroit::SUPPRIMER_PROFIL])) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->set('title', __d('connecteur', 'connecteur.titreGestionConnecteurs'));
$this->set('connecteurs', $this->connecteurs);
}
}
......@@ -28,24 +28,49 @@ use Libriciel\Utility\Password\PasswordStrengthMeterAnssi;
class UsersController extends AppController {
public $uses = [
'User',
'Organisation',
'Role',
'Admin',
'AuthComponent',
'Authentification',
'ConnecteurLdap',
'Droit',
'ListeDroit',
'Organisation',
'OrganisationUser',
'Droit',
'RoleDroit',
'OrganisationUserService',
'OrganisationUserRole',
'Role',
'RoleDroit',
'Service',
'OrganisationUserService',
'Admin',
'AuthComponent'
'User'
];
public $helpers = [
'Controls'
];
public $components = [
'RequestHandler'
'RequestHandler',
// 'Auth' => [
// 'mapActions' => [
// 'read' => [
// 'getAdresse',
// 'getCP',
// 'getNom',
// 'getPrenom',
// 'getVille',
// 'admin_view',
// 'admin_index',
// 'manager_index',
// 'manager_view'
// ],
// 'changeFormatSortie',
// 'changeUserMdp',
// 'create' => ['admin_add', 'admin_changeMdp', 'manager_add', 'manager_changeMdp', 'admin_acl_edit', 'manager_acl_edit'],
// 'update' => ['admin_edit', 'manager_edit'],
// 'delete' => ['admin_delete', 'manager_delete', 'admin_enable', 'manager_enable', 'admin_disable', 'manager_disable'],
// 'allow' => ['login', 'logout', 'casLogin', 'casLogout', 'changeServiceEmetteur', 'changeTheme', 'view']
// ]
// ]
];
/**
......@@ -655,6 +680,20 @@ class UsersController extends AppController {
}
}
/**
* @access public
* @return type
*/
public function casLogin()
{
if ($this->Auth->login()) {
return $this->_login();
}
return $this->redirect(['admin' => false, 'prefix' => false, 'controller' => 'user', 'action' => 'login']);
}
/**
* Page de login
*
......@@ -669,15 +708,118 @@ class UsersController extends AppController {
$this->layout = 'login';
if ($this->request->is('post')) {
if ($this->Auth->login()) {
$autorisationLogin = false;
$idUser = $this->User->find('first', [
'conditions' => [
'username' => $this->request->data('User.username')
],
'fields' => [
'id'
],
]);
if (!empty($idUser)) {
$query = [
'fields' => [
'OrganisationUser.id',
'OrganisationUser.user_id',
'OrganisationUser.organisation_id',
// //
'ConnecteurLdap.organisation_id',
'ConnecteurLdap.password',
'ConnecteurLdap.login',
'ConnecteurLdap.host',
'ConnecteurLdap.port',
'ConnecteurLdap.use',
'ConnecteurLdap.type',
'ConnecteurLdap.host_fall_over',
'ConnecteurLdap.basedn',
'ConnecteurLdap.tls',
'ConnecteurLdap.version',
'ConnecteurLdap.account_suffix',
'ConnecteurLdap.username',
'ConnecteurLdap.note',
'ConnecteurLdap.nom',
'ConnecteurLdap.prenom',
'ConnecteurLdap.email',
'ConnecteurLdap.telfixe',
'ConnecteurLdap.telmobile',
'ConnecteurLdap.active',
'Authentification.organisation_id',
'Authentification.port',
'Authentification.use',
'Authentification.type',
'Authentification.serveur',
'Authentification.uri',
'Authentification.name_fichier'
],
'joins' => [
$this->OrganisationUser->join('Organisation', ['type' => 'INNER']),
$this->OrganisationUser->Organisation->join('ConnecteurLdap', ['type' => 'INNER']),
$this->OrganisationUser->Organisation->join('Authentification', ['type' => 'INNER']),
],
'conditions' => [
'OrganisationUser.user_id' => $idUser['User']['id'],
'ConnecteurLdap.use' => true,
'Authentification.use' => true,
],
];
$infoUser = $this->OrganisationUser->find('all', $query);
if (!empty($infoUser)) {
foreach ($infoUser as $connecteurLdap) {
$host = $connecteurLdap['ConnecteurLdap']['host'];
$port = $connecteurLdap['ConnecteurLdap']['port'];
$ping = @fsockopen($host, $port, $errno, $errstr, 30);
@fclose($ping);
$host_fall_over = $connecteurLdap['ConnecteurLdap']['host_fall_over'];
$port_fall_over = $connecteurLdap['ConnecteurLdap']['port'];
$ping_fall_over = @fsockopen($host_fall_over, $port_fall_over, $errno_fall_over, $errstr_fall_over, 30);
@fclose($ping_fall_over);
if($ping && $ping_fall_over){
if ($autorisationLogin === false) {
$connecteurLdap['ConnecteurLdap']['fields']['User'] = [
'username' => $connecteurLdap['ConnecteurLdap']['username'],
'note' => $connecteurLdap['ConnecteurLdap']['note'],
'nom' => $connecteurLdap['ConnecteurLdap']['nom'],
'prenom' => $connecteurLdap['ConnecteurLdap']['prenom'],
'email' => $connecteurLdap['ConnecteurLdap']['email'],
'telfixe' => $connecteurLdap['ConnecteurLdap']['telfixe'],
'telmobile' => $connecteurLdap['ConnecteurLdap']['telmobile'],
'active' => $connecteurLdap['ConnecteurLdap']['active']
];
unset ($connecteurLdap['ConnecteurLdap']['username']);
unset ($connecteurLdap['ConnecteurLdap']['note']);
unset ($connecteurLdap['ConnecteurLdap']['nom']);
unset ($connecteurLdap['ConnecteurLdap']['prenom']);
unset ($connecteurLdap['ConnecteurLdap']['email']);
unset ($connecteurLdap['ConnecteurLdap']['telfixe']);
unset ($connecteurLdap['ConnecteurLdap']['telmobile']);
unset ($connecteurLdap['ConnecteurLdap']['active']);
Configure::write('LdapManager.Ldap', $connecteurLdap['ConnecteurLdap']);
Configure::write('AuthManager.Authentification', $connecteurLdap['Authentification']);
$autorisationLogin = $this->Auth->login();
}
}
}
}
}
if ($autorisationLogin === true || $this->Auth->login()) {
$this->_cleanSession();
$su = $this->Admin->find('count', [
'conditions' => [
'user_id' => $this->Auth->user('id')
]
]);
if ($su) {
$this->Session->write('Su', true);
} else {
......@@ -694,10 +836,9 @@ class UsersController extends AppController {
]
]
]);
$serviceUser = Hash::extract($service, '{n}.OrganisationUserService.Service');
$serviceUser = Hash::combine($serviceUser, '{n}.id', '{n}.libelle');
$this->Session->write('User.service', $serviceUser);
if(!empty($this->Session->read('Auth.User.uuid'))){
......@@ -718,6 +859,15 @@ class UsersController extends AppController {
}
}
/**
* @access public
*/
public function casLogout()
{
$this->layout = 'login';
}
/**
* Page de deconnexion
*
......
# Locale fra
# authentification.po
#