aaieduhr / aosi-module-mysql
AOSI MySQL Module
Package info
gitlab.opencode.hr/srce/aai-eduhr/aosi/aosi-module-mysql
Type:aosi-module
pkg:composer/aaieduhr/aosi-module-mysql
Requires
- php: >=8.2
Requires (Dev)
- aaieduhr/aosi: ^5
- phpstan/phpstan: ^2.1
- phpstan/phpstan-deprecation-rules: ^2.0
- phpunit/phpunit: ^10 || ^11
- rector/rector: ^2.0
- slevomat/coding-standard: ^8
- squizlabs/php_codesniffer: ^3
This package is not auto-updated.
Last update: 2026-04-15 09:43:21 UTC
README
Sadržaj
- Pregled
- Tipični scenarij upotrebe
- Struktura baze podataka
- Konfiguracija modula
- Opis rada
- Transakcije i konzistentnost
- Model pohrane atributa
- Obrada grešaka
- Sigurnosne preporuke
- Rješavanje problema
- Preporučene primjene
Pregled
AOSI MySQL modul sinkronizira korisničke podatke iz LDAP direktorija sa MySQL bazom podataka svaki put kada se kroz AOSI nad njima izvrši promjena.
Modul pohranjuje:
- [x] zapise o korisnicima
- [x] odabrane LDAP atribute
- [x] vrijednosti atributa
Time se omogućuje da se vanjski sustavi oslanjaju na bazu podataka umjesto na direktan pristup LDAP-u za dohvat određenih korisničkih podataka.
Tipični scenarij upotrebe
Primjer tijeka rada:
- Administrator u AOSI-ju kreira korisnika u LDAP direktoriju
- Modul detektira događaj
- Podaci se upisuju u MySQL bazu
- Vanjski sustavi čitaju podatke iz baze
Isto vrijedi i za:
- brisanje korisnika
- dodavanje atributa
- izmjene atributa
- brisanje atributa
Struktura baze podataka
Tablica korisnika
Sadrži po jedan redak za svakog LDAP korisnika.
CREATE TABLE `user` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`persistent_id` VARCHAR(32) NOT NULL,
`uid` VARCHAR(30) NOT NULL,
`changed_by` VARCHAR(30),
`active` TINYINT(1) DEFAULT NULL,
`ts` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY `uniq_persistent_id` (persistent_id)
);
Tablica vrijednosti atributa
Sadrži po jedan redak za svaku pojedinu vrijednost atributa.
CREATE TABLE attribute_value (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`user_id` INT NOT NULL,
`name` VARCHAR(50) NOT NULL,
`value` VARCHAR(250) NOT NULL,
`active` TINYINT(1) DEFAULT NULL,
UNIQUE KEY `uniq_userid_name_value` (user_id, name, value)
);
Napomena:
Ako vrijednost ključaactive_colu konfiguraciji modula nije definirana → zapisi se brišu trajno.
Ako je definirana → upotrebljava se deaktivacija (soft-delete) (active = 0).
Konfiguracija modula
Konfiguracijska datoteka: config/mysql.php
return [
'db_connection' => 'default',
'users_table' => 'user',
'values_table' => 'attribute',
'uid' => 'uid',
'active_col' => 'active',
'changedby_col' => 'changed_by',
'attribute_list' => 'cn,
sn,
givenName,
hrEduPersonUniqueID,
hrEduPersonPersistentID,
hrEduPersonExpireDate',
];
Konfiguracijski parametri
db_connection :
Naziv konekcije iz database.php.
users_table :
Naziv tablice korisnika.
values_table :
Naziv tablice atributa.
uid :
Jedinstveni identifikator korisnika.
Podržano:
uid
dn
hrEduPersonUniqueID
active_col :
Omogućuje soft-delete.
changedby_col :
Korisnik koji je napravio promjenu.
attribute_list :
LDAP atributi koji se sinkroniziraju.
Opis rada
Event-driven arhitektura:
- Before-* (validacija)
- After-* (sinkronizacija)
Sve funkcije modula pokreću se pojavom signala događaja ("Events") vezanih uz uz specifične operacije nad LDAP imenikom izvršene putem AOSI aplikacije.
Operacije:
- dodavanje korisnika (skupa s pripadajućim atributima)
- brisanje korisnika
- dodavanje (vrijednosti) atributa
- izmjena vrijednosti atributa
- brisanje (vrijednosti) atributa
Signali se dijele na predoperacijske i postoperacijske. Predoperacijski se aktiviraju prije početka ("Before-*") LDAP operacije dok se postoperacijski aktiviraju po njenom uspješnom izvršenju ("After-*").
Primjeri:
BeforeAddUserEvent
AfterAddUserEvent
BeforeModifyUserAttributeEvent
AfterDeleteUserAttributeEvent
Signalima se pozivaju metode modula. Općenita je namjena predoperacijskih metoda da obave neku provjeru (npr. postoji li već isti korisnik u bazi prije negoli ga dodamo) te na temelju njenog rezultata blokiraju ili dozvole samu operaciju u LDAP-u, dok su postoperacijske metode te koje uobičajeno služe za sinkronizaciju, odnosno "prepisivanje" novog stanja podataka iz LDAP imenika u podatkovnu bazu.
Dodavanje korisnika
Predoperacijska metoda: beforeAddUser → Obustavlja dodavanje korisnika u LDAP imenik ako se aktivni korisnik s istim jedinstvenim identifikatorom (UID) već nalazi u podatkovnoj bazi.
Postoperacijska metoda: afterAddUser → Dodaje novog (ili reaktivira postojećeg neaktivnog) korisnika u tablici korisnika te sinkronizira skup vrijednosti svih njegovih pripadajućih atributa sa skupom zatečenim u tablici vrijednosti atributa.1
Napomena:
Pri dodavanju korisnika (i samo pri dodavanju), ako je u pod. bazi pronađen deaktivirani raniji zapis i istim UID-om, smatra se da on pripada tom korisniku isključivo ako se osim UID-a podudara i hrEduPersonPersistentID. U slučaju da se vrijednosti hrEduPersonPersistentID-ja ne podudaraju, stvara se zapis o novom korisniku s novim hrEduPersistentID-jem. U svim ostalim operacijama nad LDAP imenikom koje podržava ovaj modul, korisnik se identificira samo po UID-u.
Rezultat:
- novi/reaktivirani zapis korisnika u tablici korisnika
- vrijednosti atributa korisnika spremljeni u tablicu vrijednosti atributa
Brisanje korisnika
Predoperacijska metoda: \
Postoperacijska metoda: afterDeleteUser → Briše ili deaktivira2 korisnika u podatkovnoj bazi. U slučaju same deaktivacije korisnika, zapisi o vrijednostima njegovih atributa ostaju netaknuti (zapisani kao aktivni). U suprotnom, i korisnik i svi pripadajući mu atributi brišu se iz baze.
Rezultat:
- s uključenom postavkom soft-delete korisnik se deaktivira; u suprotnom se briše
- s uključenom postavkom soft-delete atributi ostaju netaknuti; u suprotnom se brišu
Dodavanje vrijednosti atributa
Predoperacijska metoda: beforeAddUserAttribute → Obustavlja dodavanje (vrijednosti) atributa korisnika u LDAP imenik ako nije pronađen zapis koji dokazuje da taj korisnik postoji u podatkovnoj bazi i da je aktivan.
Postoperacijska metoda: afterAddUserAttribute → Dodaje novu vrijednost atributa u bazu ili reaktivira istu koja je ranije bila deaktivirana.
Rezultat:
- vrijednosti atributa dodaju se u bazu
Izmjena vrijednosti atributa
Predoperacijska metoda: beforeModifyUserAttribute → Obustavlja izmjenu vrijednosti atributa korisnika u LDAP imeniku ako nije pronađen zapis koji dokazuje da taj korisnik postoji u podatkovnoj bazi i da je aktivan.
Postoperacijska metoda: afterModifyUserAttribute → Sinkronizira novi skup vrijednosti atributa (jedne ili više njih - ako se radi o atributu s višestrukim vrijednostima) s postojećim skupom iz baze.3
Rezultat:
- stare vrijednosti se uklanjaju
- nove vrijednosti se upisuju
Brisanje vrijednosti atributa
Predoperacijska metoda: beforeDeleteUserAttribute → Obustavlja brisanje (vrijednosti) atributa korisnika u LDAP imeniku ako nije pronađen zapis koji dokazuje da taj korisnik postoji u podatkovnoj bazi i da je aktivan.
Postoperacijska metoda: afterDeleteUserAttribute → Briše ili deaktivira2 specifičnu vrijednost atributa u bazi.
Rezultat:
- vrijednosti atributa se brišu ili deaktiviraju ako je uključena postavka soft-delete
[1]: Ako je korisnik jednom bio aktivan te je nakon toga bio deaktiviran (obrisan s uključenom postavkom za soft-delete3.1), dodavanjem tog istog korisnika (s istim UID-om i istim hrEduPersonPersistentID-jem) reaktivirat će se njegov stari zapis u tablici korisnika. Vrijednosti atributa ne brišu se ni deaktiviraju samom deaktivacijom korisnika - za to bi iste morale biti same ručno deaktivirane ranije. Umjesto toga, njihovi zapisi u tablici vrijednosti atributa ostaju netaknuti sve dok ne reaktiviramo njihovog vlasnika. Tada se događa sinkronizacija sa skupom novih atributa i njihovih vrijednosti: aktivne stare vrijednosti koje za reaktiviranog korisnika i dalje vrijede ne diraju se; vrijednosti koje za reaktiviranog korisnika više ne vrijede deaktiviraju se, a vrijednosti kojih prije uopće nije bilo u tablici se dodaju.
[2]: ako je uključena postavka soft-delete
[3]: Sinkronizacija u slučaju izmjene vrijednosti atributa se odvija tako da se stare vrijednosti atributa, neovisno o postavci soft-delete, uvijek potpuno brišu iz baze ako ih više nema u skupu novih vrijednosti. Ovo je zadano ponašanje modula.
Transakcije i konzistentnost
Sve operacije nad bazom izvršavaju se unutar transakcije.
Ako dođe do greške:
- transakcija se poništava
- LDAP operacija može biti zaustavljena
Na taj način LDAP imenik i baza ostaju sinkronizirani.
Model pohrane atributa
Neki LDAP atributi mogu imati više vrijednosti.
Primjer LDAP zapisa:
mail: user@example.com
mail: user2@example.com
Pohrana u bazi:
| user_id | name | value |
|---|---|---|
| 10 | adresa1@mail.hr | |
| 10 | adresa2@mail.hr |
Obrada grešaka
Sve predoperacijske i postoperacijske metode vraćaju niz:
[error_code, message, previous_error]
Primjer:
[-10210, "User already exists!", 0]
Ako error_code nije 0, LDAP operacija može biti prekinuta.
Sigurnosne preporuke
Preporučuje se:
- ograničiti
attribute_list - ne spremati LDAP atribute s osjetljivim informacijama
- ograničiti pristup bazi
- redovito izrađivati sigurnosne kopije baze
Rješavanje problema
Korisnik se ne pojavljuje u bazi:
Provjeriti:
- konfiguraciju attribute_list
- mapiranje UID-a
- konekciju prema bazi
- posljednje unose u dnevničkim zapisima (
data/logs/app.log)
Nedostaju atributi
Provjeriti nalaze li se definirani u konfiguracijskoj postavci:
mysql.attribute_list
Brisanje korisnika ne uklanja zapise
Ako je definiran active_col, zapisi se ne brišu nego deaktiviraju.
Preporučene primjene
Modul je posebno koristan za:
- sinkronizaciju identiteta između sustava
- automatizaciju korisničkih računa (user provisioning)
- integraciju aplikacija bez LDAP podrške
- analitičke i izvještajne sustave