Contrôle d’accès simple avec CodeIgniter

Une des choses redondantes dans un projet, c’est le contrôle d’accès. Savoir jusqu’où un utilisateur non connecté peut aller, ou même limiter les droits de certains utilisateurs.
Le truc basique c’est de checker soit dans le constructeur du contrôleur, soit dans chaque fonction du contrôleur si l’utilisateur a les droits suffisants pour continuer. Or lorsque le projet atteint une certaine ampleur, il devient vite contraignant et lourd de rajouter ce contrôle à chaque fonction.

Étendre la classe controller

Au début, je pensais créer un hook pre-controller mais toutes les fonctionnalités dont j’avais besoin n’étaient pas chargées. Du coup j’étends la classe controller afin que chaque contrôleur commence par checker l’accès avant d’aller plus loin.

Pour étendre la classe controller il faut créer un fichier /application/core/MY_Controller.php

Préparer les liens accessibles sans connexion

Ici je définis tous les liens ( controleur/fonction ) qui peuvent être accessibles sans connexion. Pour moi c’est plus simple dans ce sens, il est possible de faire l’inverse s’il y a plus d’endroits accessibles sans connexion qu’avec connexion.

Je créé donc un tableau avec les fonctions qui n’ont pas besoin de contrôle d’accès. C’est utile de mettre les fonctions car on peut très bien imaginer une fonction profil dans le contrôleur user, qui aurait besoin d’un contrôle d’accès.

Mise en place du contrôle d’accès

Voila tout est fait.

Explications:

A chaque chargement du contrôleur, on construit l’URI pour n’avoir que le contrôleur et sa fonction. On vérifie à partir de la session si la personne est connectée et si l’url qu’elle demande lui est autorisée. Avec cet exemple simple, un utilisateur non connecté peut accéder qu’aux liens présents dans le tableau. Pour tous les autres il doit être connecté. Lorsque l’utilisateur n’est pas accepté, il est redirigé directement vers l’accueil.

Maintenant c’est bien beau, mais il va falloir modifier chaque contrôleur afin de les étendre à partir de notre nouveau contrôleur de base.

Conseil d’utilisation de ce système:

Si vous n’avez pas du tout besoin du contrôle d’accès dans votre contrôleur, vous créez votre contrôleur normalement ( extends CI_Controller ).

Si au moins une fonction de votre contrôleur a besoin du contrôle d’accès alors vous créez à partir de votre contrôleur étendu ( extends MY_Controller ).

CodeIgniter avec Nginx

Depuis un moment je voulais essayer Nginx, puisqu’il est apparemment, bien plus performant qu’Apache. Donc je me suis décidé à passer le pas, et je vais expliquer ici ma démarche.

D’abord je vous conseille de lire cet article (en anglais) qui explique les différences importantes entre Apache et Nginx. Ca permet de savoir où on met les pieds.

Pour cette installation je travaille sur Ubuntu 12.04.2 LTS.

Installation

Dans un premier, il faut arrêter tous les services qui pourrait écouter sur le port 80 (http). Dans mon cas, j’ai besoin de stopper Apache

Ensuite on installe les paquets nécessaires.

Configuration de PHP-FPM

Une petite modification au fichier /etc/php5/fpm/php.ini est nécessaire afin d’empêcher un potentiel risque de sécurité.

Et redémarrer le service

Configuration de Nginx

Créer un fichier « nom_de_votre_domaine » dans /etc/nginx/sites-available et y ajouter ceci

Modifier les valeurs de server_name (votre nom de domaine) et de root (le répertoire où se situe votre site CodeIgniter) afin qu’ils correspondent à votre configuration.

Ajouter le lien symbolique afin d’activer le nouveau site

Recharger Nginx

Et voila, vous devez avoir accès à votre site via Nginx !

Source

Créer un site multilingue avec CodeIgniter

Version de CodeIgniter utilisé: 2.1.2

Les fonctionnalités souhaitées:

  • Affichage de la langue dans l’URL. Cela permet un meilleur référencement, avec un lien unique vers un contenu dans une langue donnée. (exemples: www.mondomaine.com/fr, www.mondomaine.com/en)
  • Détection de la langue du navigateur
  • Facilité d’évolution (ajouter une nouvelle langue)
  • Facilité d’utilisation pendant le développement

URI Language Identifier

Le vrai secret pour faire ce que l’on souhaite, est une extension de la bibliothèque Lang, disponible sur le wiki de CodeIgniter.

Cette extension permet d’afficher la langue dans l’URL et de modifier la config suivant cette langue. Si aucune langue n’est détectée, la langue par défaut est chargée.

Avec la fonctionnalité de base, on a déjà une bonne partie, mais nous n’avons toujours pas de détection de la langue du navigateur. Donc si la langue par défaut est l’anglais, qu’un utilisateur français accède à votre site sans langue spécifiée dans l’URL, il se retrouvera avec un site en anglais, alors que vous supportez aussi le français.

J’ai donc modifié cette extension afin qu’elle supporte la détection de la langue du navigateur lorsque aucune langue n’est précisée dans l’URL.

application/core/MY_lang.php

Voila, maintenant notre librairie répond parfaitement à nos attentes. Je vais maintenant vous expliquer comment la configurer, et comment l’utiliser sur votre site.

Configuration de la librairie

/application/config/config.php

$config[‘language’] représente la langue par défaut.

$config[‘language_abbr’] représente l’abréviation de la langue par défaut.

$config[‘lang_uri_abbr’] représente les langues acceptées par le site. Si vous souhaitez ajouter une nouvelle langue, c’est ici que ça se passe.

$config[‘lang_ignore’] permet de ne pas afficher la langue dans l’URL, et de seulement l’enregistrer dans un cookie. Ici cette fonctionnalité ne nous intéresse pas, donc FALSE.

application/config/routes.php

Maintenant il faut configurer les routes, puisque notre URL ressemble à ça : www.mondomaine.com/lang/controller/method/variables et ne correspond plus au modèle de fonctionnement de CodeIgniter: www.mondomaine.com/controller/method/variables.

Par contre, si vous souhaitez ajouter une nouvelle route, il faudra l’ajouter avant ces dernières et tenir compte de la langue. Exemple:

Voila maintenant tout est configuré et fonctionnel. Je vais maintenant vous comment utiliser tout cela.

Utilisation

Configuré c’est bien beau, mais comment je fais pour récupérer les bons textes suivant la langue ???

Tout se passe dans le répertoire application/language. Normalement vous avez un répertoire « english » qui est déjà créé. Il suffit de rajouter un nouveau répertoire pour chaque langue souhaitée.

Ensuite il faut créer un fichier de langue par répertoire de langue, ayant exactement le même nom et le suffixe « _lang ». Par exemple form_lang.php. Ce fichier de langue servira pour tous mes formulaires.

Ensuite le contenu de ce fichier est un simple tableau PHP.

application/language/francais/form_lang.php

application/language/english/form_lang.php

Maintenant il ne reste plus qu’à charger le bon fichier de langue dans le constructeur de votre contrôleur.

Pour l’utilisation, il suffit d’utiliser le helper présent dans l’extension de la librairie Lang:

Ensuite pour toutes les fonctions d’aide à la création d’URL (URL Helper), il faut utiliser base_url pour avoir l’URL du site (www.mondomaine.com), et site_url pour avoir l’URL avec la langue (www.mondomaine.com/fr).

Astuces

Pour les fichiers de langue en Français et autres, n’oubliez pas d’enregistrer en UTF-8 sans Bom afin d’éviter les erreurs.

Pensez à copier les fichiers de langue présents dans system/language/english vers vos nouveaux répertoires de langue afin d’avoir les erreurs affichées au moins en anglais.

Faire une recherche sur Geonames à partir de PHP

Geonames est une base de données géographiques sous licence Creative Commons qui contient plus de 8 millions d’éléments (villes, monument, parc, etc…).

Un webservice est mis à disposition afin de pouvoir récupérer tout un tas d’information facilement. Pour y accéder il suffit de créer un compte ici, tout est gratuit. Il y a une limite qui est très haute: 30 000 crédits par jour et 2000 crédits par heure. La taille du crédit change suivant le type de service web appelé, mais pour une recherche, un crédit = une requête.

Donc dans l’exemple qui suit nous allons rechercher « tour eiffel » et nous allons récupérer les coordonnés géographiques, ainsi que la traduction en Anglais.

Nous récupérerons les informations dans un XML.

Voila avec ce simple PHP on peut récupérer des informations sur une ville ou autre très rapidement.

Jetez un oeil au XML afin de voir toutes les informations potentiellement utilisables.