IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Introducció

L'aplicació skeleton està basada en l'aplicació Ion Auth a la qual se li han afegit certes funcionalitats i modificacions. Una de les modificacions principals es de dotar d'unes vistes per defecte per a les pantalles de login i recuperació de la paraula de pas. La presentació de les vistes utilitza Bootstrap

Finalment l'aplicació skeleton també afegeix una estructura bàsica a l'aplicació amb un menú de capçalera i un peu de pàgina, així com uns menús bàsics de navegació:

  • Logout
  • Informació de l'usuari i configuració de preferències d'usuari
  • Gestió d'usuaris i grups
  • Gestió d'espais i ???

Requeriments

  • Aplicacions de tercers/llibreries que cal instal·lar (carpeta application/third_party)
  • Postfix o un altre MTA si es vol enviar correus electrònics per tal de recuperar la paraula de pas

Característiques

  • Suport per a diferents reialmes d'autenticació: MySQL i Ldap
  • Creació de comptes d'usuari MySQL a partir de comptes Ldap.
  • Suport de preferències d'usuari. Les preferències dels usuaris sempre es guarden a MySQL
  • Mode manteniment
  • Recuperació de paraules de pas per correu electrònic. Es pot modificar/recuperar la paraula de pas Ldap com la MySQL


Instal·lació

Instal·lació de requeriments

Llegiu primer l'apartat requeriments.

IMPORTANT: Des de l'agost de 2013, ebre-inventory no incorpora de sèrie code-igniter i per tant el pas previ és instal·lar codeigniter. Vegeu:

 Code igniter instal·lació per a múltiples aplicacions

També cal instal·lar el language pack en català seguint les passes de:

 Code Igniter traducció al català

Cal tenir un servidor amb LAMP instal·lat i un servidor Ldap si es vol utilitzar Ldap. Per instal·lar un servidor LAMP podeu executar:

$ sudo apt-get install tasksel
$ sudo tasksel install lamp-server

Vegeu LAMP, tasksel i Ubuntu Server per a més informació.

Enviament de correus electrònics per sendmail

Per tal de poder enviar la recuperació de paraules de pas per correu electrònics cal tenir un MTA instal·lat. A Ubuntu podeu instal·lar Postfix amb:

$ sudo tasksel

I Instal·leu el servidor de correu


Instal·lació de Ldap per a treballar amb autenticació Ldap

Com a requeriments també cal instal·lar la llibreria Ldap de PHP:

$ sudo apt-get install php5-ldap
$ sudo /etc/init.d/apache2 reload

Per instal·lar un servidor Ldap us recomanem utilitzar OpenLdap. El podeu instal·lar sol seguint els passos de l'article Ldap () o podeu instal·lar un Ldap més l'aplició web Gosa. En aquest últim cas, l'aplicació installgosa seguint els passos de:

 Instal·lació d'install-gosa

NOTA: Per a més informació de com crear un servidor de gestió d'usuaris amb Ldap podeu consultar OpenFPnet. Servidor centralitzat de gestió d'usuaris

Instal·lació de skeleton

$ cd /usr/share
$ sudo git clone https://github.com/acacha/skeleton
$ sudo joe /etc/apache2/conf.d/skeleton

Poseu:

Alias /skeleton /usr/share/skeleton

Apliqueu els canvis a Apache:

$ sudo /etc/init.d/apache2 reload

Ara cal configurar l'aplicació. Comencem per l'accés a bases de dades, primer SQL:

Creeu la base de dades. Per crear la base de dades i l'usuari d'accés, primer obteniu una clau aleatòria:

$ mkpasswd

Per l'exemple suposem que ens dona:

6RqN5CCc1zuVE

Ara entreu al servidor de MySQL, heu de saber la paraula de pas de l'usuari root o d'un usuari amb permisos (a Debian per exemple es pot utilitzar l'usuari debian-sys-maint del fitxer /etc/mysql/debian.cnf )

$ sudo mysql -u root -p

Les comandes per crear la base de dades són:

IMPORTANT: Canvieu el nom de la base de dades per tal de posar el que trobeu més convenient en el vostre cas!

mysql> CREATE DATABASE skeleton;
mysql> CREATE USER 'skeleton'@'localhost' IDENTIFIED BY '6RqN5CCc1zuVE';
mysql> GRANT ALL PRIVILEGES ON skeleton.* TO 'skeleton'@'%' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
mysql> exit;

NOTA: Si us equivoqueu al establir la paraula de pas o simplement la voleu canviar:

SET PASSWORD FOR 'skeleton'@'localhost' = PASSWORD('6RqN5CCc1zuVE')

A l'arrel del projecte trobareu un fitxer mysql amb l'estructura:

$ cd /usr/share/skeleton 
$ sudo mysql -p skeleton < skeleton_only_structure.sql

Se us proporciona un fitxer de base de dades exemple, feu una còpia:

$ sudo cp application/config/database.php.example application/config/database.php

Ara poseu les dades de connexió al fitxer:

$ sudo joe application/config/database.php

Canvieu les dades:

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'skeleton';
$db['default']['password'] = '6RqN5CCc1zuVE';
$db['default']['database'] = 'skeleton';
$db['default']['dbdriver'] = 'mysql';

Configureu els permisos dels fitxers:

$ sudo chown -R www-data:www-data application/logs/

I també el upload de fitxers:

$ sudo mkdir -p assets/uploads/
$ sudo chown www-data:www-data -R assets/uploads/

Ara cal configurar l'accés per Ldap. Teniu un fitxer d'exemple:

$ sudo cp application/config/auth_ldap.php.example application/config/auth_ldap.php

IMPORTANT: Els següents passos de configuració de Ldap "només" són necessaris per tal que funcioni l'autenticació d'usuaris per Ldap. És clar, és imprescindible que al servidor Ldap que us connecteu existeixin els usuaris adequats i que configureu els grups/rols d'accés per determinar quins permisos d'accés tindran els usuaris. Vegeu l'apartat Rols

Si voleu utilitzar el reialme d'autenticació Ldap editeu el fitxer i poseu les vostres dades de connexió al servidor Ldap:

$ sudo joe application/config/auth_ldap.php

Poseu els valors del vostre server Ldap. Un exemple:

$config['hosts'] =array('10.140.128.22');
$config['ports'] = array(389);
$config['basedn'] = 'dc=augute,dc=org';
$config['login_attribute'] = 'uid';
$config['proxy_user'] = 'cn=admin,dc=augute,dc=org';
$config['proxy_pass'] = 'PASSWORD';

canvieu les dades de l'exemple pel que us pertoqui.

IMPORTANT: Si teniu Gosa instal·lat podeu obtenir les dades de configuració del fitxer /etc/gosa/gosa.conf

IMPORTANT: Si utilitzeu git com a desenvolupadors, afegiu al fitxer .git/info/exclude els fitxers application/config/auth_ldap.php i application/config/database.php per tal d'ignorar-los per part de git. Consulteu Excloure els fitxers amb dades sensibles. És necessari fer això si feu commits al repositori git del projecte o a repositoris/forks propis sobretot si els repositoris són públics per tal d'evitar publicar dades sensibles com les paraules d'accés a les bases de dades

$ sudo joe .git/info/exclude

I afegiu les línies:

application/config/auth_ldap.php
application/config/database.php
application/logs/audit.log

NOTA: audit.log és un fitxer que guarda un registre dels accessos al sistema. No cal pujar-lo al repositori és informació diferent a cada instal·lació i a més no cal fer-la pública

Ara cal instal·lar les apps de tercers:

$ cd /usr/share/skeleton/application/third_party
$ sudo git clone https://github.com/acacha/grocery-crud
$ sudo git clone https://github.com/scoumbourdis/image-crud

Configureu l'aplicació:

$ sudo cp /usr/share/skeleton/application/config/skeleton_auth.php.example /usr/share/skeleton/application/config/skeleton_auth.php

Editeu el fitxer:

$ sudo joe /usr/share/skeleton/application/config/skeleton_auth.php

NOTA: Podeu deixar la configuració per defecte...


Ara podeu consultar l'aplicació a:

http://localhost/skeleton

Instal·lació com aplicació third_party de Code Igniter

Cal utilitzar com a plantilla buida per crear un aplicació els fitxers:

/usr/share/codeigniter/index.php

i la carpeta:

/usr/share/codeigniter/index.php

Instal·leu amb git clone l'aplicació skeleton a:

$ cd application/thir_party
$ git clone https://github.com/acacha/skeleton

Llegiu la documentació d'Skeleton per instal·lar tots els requeriments d'aquesta aplicació

La configuració bàsica inicial gira entorn de la configuració dels controladors per defecte i de Login. Creeu un controlador inicial:

$ sudo geany application/skeleton.php
<?php defined('BASEPATH') OR exit('No direct script access allowed');
include "application/third_party/skeleton/application/controllers/skeleton_main.php";

class skeleton extends skeleton_main {
	
	function __construct()
    {
		parent::__construct();
	}
	
	public function index() {
		
		if (!$this->skeleton_auth->logged_in())
		{
			//redirect them to the login page
			redirect($this->skeleton_auth->login_page, 'refresh');
		}
		redirect('dashboard','refresh');
	}
}

I feu un link al controlador auth:

$ cd application/controllers
$ sudo mkdir skeleton_auth && cd skeleton_auth
$ sudo ln -s ../../../application/third_party/skeleton/application/controllers/skeleton_auth/auth.php

Ara ja podeu entra a la vostra aplicació i us apareixerà la pàgina de login. Cal que adapteu els paràmetres de configuració:

$ sudo geany application/third_party/skeleton/application/config/skeleton_auth.php

Vegeu també ebre-escool

Exemples

Activar el mode manteniment

El mode manteniment permet desactivar temporalment l'autenticació d'usuaris i activa un usuari i paraula de pas per defecte per entrar com administrador a l'aplicació. Cal activar aquest mode al fitxer de configuració posant:

$config['maintenance_mode'] = false;

La resta de dades del mode manteniment es troben també al fitxer de configuració:

|--------------------------------------------------------------------------
| MAINTENANCE MODE
|--------------------------------------------------------------------------
|
| Activate maintenance mode?
| 
| Example: false
*/
$config['maintenance_mode'] = true;

//MAINTENANCE MODE DATA
$config['maintenance_mode_user'] = "maintenance";
$config['maintenance_mode_password'] = "paraula de pas";		
$config['maintenance_mode_user_email'] = "intranet@example.com";
$config['maintenance_mode_user_id'] = 5000;

Configuració

routes.php

El fitxer:

application/config/routes.php

és un fitxer principal de configuració de code Igniter. Aquí indiquem quin és el controlador per defecte (el que s'utilitza si no es crida cap controlador específic). Lo habitual amb l'aplicació skeleton és que per defecte enviem els usuaris a la pàgina de Login on si encara no estan logats se'ls mostrarà el formulari de Login o sinó la pàgina principal de l'aplicació. Cal configurar doncs les línies:

$route['default_controller'] = "skeleton_main";
$route['404_override'] = "skeleton_main/error404";


skeleton_auth.php

A la carpeta config es troba aquest fitxer de configuració. Aquí bàsicament hi ha tots aquells paràmetres relacionats amb les pàgines de login i relacionades (p.ex. recuperació de la paraula de pas)

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/*
| -------------------------------------------------------------------------
| METADATA
| -------------------------------------------------------------------------
| 
*/
$config['login_appname'] = "Intranet";
$config['login_entity'] = "Institut del Ebre";

$config['copyright_url'] = "http://acacha.org/mediawiki/index.php/ebre-escool";
$config['copyright_app_name'] = "Ebre-escool Intranet";
$config['copyright_entity_name'] = "Ebretic Enginyeria SL";
$config['copyright_entity_url'] = "http://www.ebretic.com";
$config['copyright_entity_url_name'] = "www.ebretic.com";
$config['copyright_authors_text'] ='Sergi Tur Badenas';
$config['copyright_authors_html'] ='<a href="http://acacha.org">Sergi Tur Badenas</a>';

/*
|--------------------------------------------------------------------------
| ACTIVE REALMS
|--------------------------------------------------------------------------
|
| Active Authentication Realms. Supported mysql, ldap, mongodb
| 
| Example: ldap,mysql
*/
$config['realms'] = "mysql,ldap";

/*
|--------------------------------------------------------------------------
| DEFAULT REALM
|--------------------------------------------------------------------------
|
| Default realm at login box
| 
| Example: ldap
*/
$config['default_realm'] = "ldap";

/*
|--------------------------------------------------------------------------
| ACTIVE FORGOT PASSWORD REALMS
|--------------------------------------------------------------------------
|
| Active Authentication Realms for forgot password. Supported mysql, ldap
| 
| Example: ldap,mysql
*/
$config['forgot_password_realms'] = "ldap";

/*
|--------------------------------------------------------------------------
| DEFAULT FORGOT PASSWORD REALM
|--------------------------------------------------------------------------
|
| Default realm at login box
| 
| Example: ldap
*/
$config['default_forgot_password_realm'] = "ldap";

/*
|--------------------------------------------------------------------------
| FIRST EMAIL LDAP ATTRIBUTE
|--------------------------------------------------------------------------
|
| First Ldap attribute to use for fetching user personal email
| 
| Example: email
*/
$config['first_email_ldap_attribute'] = "highSchoolPersonalEmail";

/*
|--------------------------------------------------------------------------
| SECOND EMAIL LDAP ATTRIBUTE      
|--------------------------------------------------------------------------
| 
| Second Ldap attribute to use for fetching user personal email
| 
| Example: highSchoolPersonalEmail                                                            
*/
$config['second_email_ldap_attribute'] = "email";

/*
|--------------------------------------------------------------------------
| EMAIL TO SEND FORGOTTEN PASSWORD
|--------------------------------------------------------------------------
|
| Which ldap attribute user to send forgotten passwords
| 
| Example: email                                                            
*/                             
$config['email_to_send_forgotten_password'] = "secondary_email";


/*
|--------------------------------------------------------------------------
| MAINTENANCE MODE
|--------------------------------------------------------------------------
|
| Activate maintenance mode?
| 
| Example: false
*/
$config['maintenance_mode'] = false;

//MAINTENANCE MODE DATA
$config['maintenance_mode_user'] = "maintenance";
$config['maintenance_mode_password'] = "ebre-escool";		
$config['maintenance_mode_user_email'] = "intranet@iesebre.com";
$config['maintenance_mode_user_id'] = 5000;


/*
|--------------------------------------------------------------------------
| HTML HEADER METADATA DEFAULT VALUES
|--------------------------------------------------------------------------
*/
$config['header_title'] = "Intranet. Institut de Deltebre";
$config['header_description'] = "Intranet de l'Institut de Deltebre";
$config['header_authors'] = "Sergi Tur Badenas";

/*       
|--------------------------------------------------------------------------
| DEFAULT SUPPORTED THEMES
|--------------------------------------------------------------------------
*/

$config['supported_themes'] = array (
    'flexigrid',   
    'datatables',
    'twitter-bootstrap'
    );     
    
/*       
|--------------------------------------------------------------------------
| DEFAULT THEME
|--------------------------------------------------------------------------
*/

$config['default_theme'] = "flexigrid";

/*
|--------------------------------------------------------------------------
| ROLES
|--------------------------------------------------------------------------
|
| Roles
| 
*/
$config['roles'] = array(
    1 => 'intranet_readonly',
    3 => 'intranet_admin',
    5 => 'intranet_dataentry',
    7 => 'intranet_organizationalunit'
    );

/*
|--------------------------------------------------------------------------
| GROUP WITH READONLY ROLE
|--------------------------------------------------------------------------
|
| Groups with readonly acces to app
| 
| Example: skeleton_readonly
*/
$config['skeleton_readonly_group'] = "intranet_readonly";

/*
|--------------------------------------------------------------------------
| GROUP WITH ADMIN ROLE
|--------------------------------------------------------------------------
|
| Groups with admin role
| 
| Example: skeleton_admin
*/
$config['skeleton_admin_group'] = "intranet_admin";

/*
|--------------------------------------------------------------------------
| DEFAULT LANGUAGE
|--------------------------------------------------------------------------
|
| Default language (user name of code igniter folder i languages folder)
| 
| Example: catalan
*/
$config['default_language'] = "catalan";

/*
|--------------------------------------------------------------------------
| TEACHERS BASE DN
|--------------------------------------------------------------------------
| 
| BASE DN FOR STUDENTS
| 
| Example: ou=Alumnes,ou=All,dc=iesebre,dc=com
*/
$config['students_base_dn'] = "ou=Alumnes,ou=All,dc=iesebre,dc=com";


/*
|--------------------------------------------------------------------------
| TEACHERS BASE DN
|--------------------------------------------------------------------------
|
| BASE DN FOR TEACHERS
| 
| Example: ou=Alumnes,ou=All,dc=iesebre,dc=com
*/
$config['teachers_base_dn'] = "ou=Profes,ou=All,dc=iesebre,dc=com";

/*
| -------------------------------------------------------------------------
| Database Type
| -------------------------------------------------------------------------
| If set to TRUE, Ion Auth will use MongoDB as its database backend.
|
| If you use MongoDB there are two external dependencies that have to be
| integrated with your project:
|   CodeIgniter MongoDB Active Record Library - http://github.com/alexbilbie/codeigniter-mongodb-library/tree/v2
|   CodeIgniter MongoDB Session Library - http://github.com/sepehr/ci-mongodb-session
*/
$config['use_mongodb'] = FALSE;

/*
| -------------------------------------------------------------------------
| LDAP Database Type
| -------------------------------------------------------------------------
| If set to TRUE, Ion Auth will use Ldap as its database backend.
|
*/
//OBSOLETE: USE REALMS DROPDOWN IN LOGIN FORM 
//$config['use_ldap'] = TRUE;

/*
| -------------------------------------------------------------------------
| MongoDB Collection.
| -------------------------------------------------------------------------
| Setup the mongodb docs using the following command:
| $ mongorestore sql/mongo
|
*/
$config['collections']['users']          = 'users';
$config['collections']['groups']         = 'groups';
$config['collections']['login_attempts'] = 'login_attempts';

/*
| -------------------------------------------------------------------------
| Tables.
| -------------------------------------------------------------------------
| Database table names.
*/
$config['tables']['users']           = 'users';
$config['tables']['groups']          = 'groups';
$config['tables']['users_groups']    = 'users_groups';
$config['tables']['login_attempts']  = 'login_attempts';

/*
 | Users table column and Group table column you want to join WITH.
 |
 | Joins from users.id
 | Joins from groups.id
 */
$config['join']['users']  = 'user_id';
$config['join']['groups'] = 'group_id';

/*
 | -------------------------------------------------------------------------
 | Hash Method (sha1 or bcrypt)
 | -------------------------------------------------------------------------
 | Bcrypt is available in PHP 5.3+
 |
 | IMPORTANT: Based on the recommendation by many professionals, it is highly recommended to use
 | bcrypt instead of sha1.
 |
 | NOTE: If you use bcrypt you will need to increase your password column character limit to (80)
 |
 | Below there is "default_rounds" setting.  This defines how strong the encryption will be,
 | but remember the more rounds you set the longer it will take to hash (CPU usage) So adjust
 | this based on your server hardware.
 |
 | If you are using Bcrypt the Admin password field also needs to be changed in order login as admin:
 | $2a$07$SeBknntpZror9uyftVopmu61qg0ms8Qv1yV6FG.kQOSM.9QhmTo36
 |
 | Becareful how high you set max_rounds, I would do your own testing on how long it takes
 | to encrypt with x rounds.
 */
$config['hash_method']    = 'sha1';	// IMPORTANT: Make sure this is set to either sha1 or bcrypt
$config['default_rounds'] = 8;		// This does not apply if random_rounds is set to true
$config['random_rounds']  = FALSE;
$config['min_rounds']     = 5;
$config['max_rounds']     = 9;

/*
 | -------------------------------------------------------------------------
 | Authentication options.
 | -------------------------------------------------------------------------
 | maximum_login_attempts: This maximum is not enforced by the library, but is
 | used by $this->ion_auth->is_max_login_attempts_exceeded().
 | The controller should check this function and act
 | appropriately. If this variable set to 0, there is no maximum.
 */
$config['site_title']                 = "Institut de l'Ebre - intranet";       // Site Title, example.com
$config['organization']               = "Institut de l'Ebre";       // Organization name, EBRETIC ENGINYERIA SL
$config['app_name']                   = "Intranet";       // Organization name, EBRETIC ENGINYERIA SL
$config['admin_email']                = "maninfo@iesebre.com"; // Admin Email, admin@example.com
$config['default_group']              = 'intranet_readonly';           // Default group, use name
$config['admin_group']                = 'intranet_admin';             // Default administrators group, use name
$config['identity']                   = 'username';             // A database column which is used to login with
$config['min_password_length']        = 8;                   // Minimum Required Length of Password
$config['max_password_length']        = 20;                  // Maximum Allowed Length of Password
$config['email_activation']           = FALSE;               // Email Activation for registration
$config['manual_activation']          = FALSE;               // Manual Activation for registration
$config['remember_users']             = TRUE;                // Allow users to be remembered and enable auto-login
$config['user_expire']                = 7200;               // How long to remember the user (seconds). Set to zero for no expiration
$config['user_extend_on_login']       = FALSE;               // Extend the users cookies everytime they auto-login
$config['track_login_attempts']       = TRUE;               // Track the number of failed login attempts for each user or ip.
$config['maximum_login_attempts']     = 20;                   // The maximum number of failed login attempts.
$config['lockout_time']               = 600;                 // The number of miliseconds to lockout an account due to exceeded attempts
$config['forgot_password_expiration'] = 0;                   // The number of miliseconds after which a forgot password request will expire. If set to 0, forgot password requests will not expire.


/*
 | -------------------------------------------------------------------------
 | Email options.
 | -------------------------------------------------------------------------
 | email_config:
 | 	  'file' = Use the default CI config or use from a config file
 | 	  array  = Manually set your email config settings
 */
$config['use_ci_email'] = TRUE; // Send Email using the builtin CI email class, if false it will return the code and the identity
$config['email_config'] = array(
	'mailtype'  => 'html',
	'protocol'  => 'sendmail',
	'mailpath'  => '/usr/sbin/sendmail',
    'charset'   => 'utf-8',
    'newline'   => "\r\n"
);

/*
 | -------------------------------------------------------------------------
 | Email templates.
 | -------------------------------------------------------------------------
 | Folder where email templates are stored.
 | Default: auth/
 */
$config['email_templates'] = 'auth/email/';

/*
 | -------------------------------------------------------------------------
 | Activate Account Email Template
 | -------------------------------------------------------------------------
 | Default: activate.tpl.php
 */
$config['email_activate'] = 'activate.tpl.php';

/*
 | -------------------------------------------------------------------------
 | Forgot Password Email Template
 | -------------------------------------------------------------------------
 | Default: forgot_password.tpl.php
 */
$config['email_forgot_password'] = 'forgot_password.tpl.php';

/*
 | -------------------------------------------------------------------------
 | Forgot Password Complete Email Template
 | -------------------------------------------------------------------------
 | Default: new_password.tpl.php
 */
$config['email_forgot_password_complete'] = 'new_password.tpl.php';

/*
 | -------------------------------------------------------------------------
 | Salt options
 | -------------------------------------------------------------------------
 | salt_length Default: 10
 |
 | store_salt: Should the salt be stored in the database?
 | This will change your password encryption algorithm,
 | default password, 'password', changes to
 | fbaa5e216d163a02ae630ab1a43372635dd374c0 with default salt.
 */
$config['salt_length'] = 10;
$config['store_salt']  = FALSE;

/*
 | -------------------------------------------------------------------------
 | Message Delimiters.
 | -------------------------------------------------------------------------
 */
$config['message_start_delimiter'] = '<p>'; 	// Message start delimiter
$config['message_end_delimiter']   = '</p>'; 	// Message end delimiter
$config['error_start_delimiter']   = '<p>';		// Error mesage start delimiter
$config['error_end_delimiter']     = '</p>';	// Error mesage end delimiter

/* End of file skeleton_auth.php */
/* Location: ./application/config/ion_auth.php */

Troubleshooting. Resol·lució de problemes

Please install an MTA on this system if you want to use sendmail!

Vegeu l'apartat Skeleton#Enviament_de_correus_electr.C3.B2nics_per_sendmail

Vegeu també

Enllaços externs