aaieduhr/aosi-module-mysql

AOSI MySQL Module

Maintainers

Package info

gitlab.opencode.hr/srce/aai-eduhr/aosi/aosi-module-mysql

Type:aosi-module

pkg:composer/aaieduhr/aosi-module-mysql

Statistics

Installs: 9

Dependents: 1

Suggesters: 0

v5.0.0 2026-04-14 11:18 UTC

This package is not auto-updated.

Last update: 2026-04-15 09:43:21 UTC


README

Sadržaj

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:

  1. [x] zapise o korisnicima
  2. [x] odabrane LDAP atribute
  3. [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:

  1. Administrator u AOSI-ju kreira korisnika u LDAP direktoriju
  2. Modul detektira događaj
  3. Podaci se upisuju u MySQL bazu
  4. 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ča active_col u 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_idnamevalue
10mailadresa1@mail.hr
10mailadresa2@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