Poznańskie Centrum Superkomputerowo - Sieciowe

 

 

 

 

PROJEKT LDAP

 

 

 

 

 

 

Projekt przeniesienia informacji o użytkownikach aplikacji portalowej
z relacyjnej bazy danych (Oracle) do bazy LDAP-owej

 

 

 

 

Jerzy Chochulski

Mirosław Czyrnek

 

 

 

 

 

Poznań  2003

 


Spis treści

 

 

1       Wstęp

2       Aktualny stan implementacji.

2.1     Relacyjna baza danych - struktura danych

2.2     Stan implementacji

3       Projekt

3.1     Schemat katalogowej bazy danych

3.2     Interfejs dostępowy do danych w bazie katalogowej

3.3     Implementacja narzędzia do transferu danych z relacyjnej bazy danych do bazy katalogowej

Bibliografia

 

 

 


1         Wstęp

 

W Poznańskim Centrum Superkomputerowo-Sieciowym rozwijany jest uniwersalny pakiet portalowy Joshua, implementowany w języku Java. Na jego bazie powstał portal edukacyjny Interkl@sa, jego wykorzystanie jest także ujęte w projekcie portalu Video. Dotychczas pakiet wykorzystuje relacyjną bazę danych do przechowywania informacji o użytkownikach portalu oraz ich prawach. Prezentowany projekt stawia dwa cele. Pierwszym jest utworzenie schematu bazy LDAP-owej jako repozytorium danych o użytkownikach oraz rozwinięcie uniwersalnego pakietu portalowego o interfejs dostępowy do LDAP-owej bazy użytkowników. Drugim celem projektu jest przeniesienie danych użytkowników portalu Interkl@sa z relacyjnej bazy danych do LDAP-owej bazy danych i użycie nowego interfejsu dostępowego. Implementacja nowej funkcjonalności w uniwersalnym pakiecie portalowym zapewnia dostęp do niej zarówno dla portalu Video jak i każdego budowanego w przyszłości portalu utworzonego na bazie pakietu Joshua.

 


2         Aktualny stan implementacji.

 

W niniejszym rozdziale przedstawiony jest aktualny stan implementacji zarządzania użytkownikami w uniwersalnym pakiecie portalowym.

2.1      Relacyjna baza danych - struktura danych

 

Dane o użytkownikach, grupach do których użytkownicy przynależą oraz o prawach użytkowników przechowywane są w relacyjnej bazie danych (Oracle). Biorąc pod uwagę, że informacja o prawach użytkowników będzie nadal przechowywana w tej bazie (zadecydowała specyfika danych - stosunkowo częsty zapis, a także powody implementacyjne - tabela praw jest powiązana z wieloma innymi tabelami, przez co jej wydzielenie byłoby związane ze zbyt dużą ilością zmian w kodach źródłowych), struktury danych dotyczące praw nie będą przedstawiane w tym rozdziale. Informacja o użytkownikach portalu i grupach przechowywana jest w czterech tabelach wzajemnie powiązanych stanowiących jednocześnie odrębną całość niepowiązaną z innymi tabelami.

 

Tabela pt_users (informacja o użytkownikach portalu)

Pole

Typ

Znaczenie

us_id

number(10)

Identyfikator numeryczny użytkownika

us_po_id

varchar2(80)

Identyfikator portalu

us_login

varchar2(30)

Identyfikator alfanumeryczny użytkownika służący do jego logowania się w portalu

us_password

varchar2(30)

Hasło

us_enabled

varchar2(10)

Pole określające dostęp użytkownika do portalu (dozwolony lub zablokowany)

us_email

varchar2(120)

E-mail

us_mobile

varchar2(20)

Imię

us_sname

varchar2(120)

Nazwisko

us_admin

varchar2(10)

Pole określające czy użytkownik jest administratorem

us_mod_date

date

Data ostatniej modyfikacji danych użytkownika

us_mod_user

varchar2(30)

Identyfikator alfanumeryczny użytkownika zmieniającego dane

us_login_date

date

Data ostatniego zalogowania użytkownika w portalu

us_last_login_date

date

Data poprzedniego zalogowania użytkownika w portalu

 


Tabela pt_user_props (zawiera dodatkowe własności użytkownika)

Pole

Typ

Znaczenie

up_id

number(10)

Identyfikator numeryczny własności

up_us_id

number(10)

Identyfikator numeryczny użytkownika

up_name

varchar2(250)

Nazwa własności

us_value

varchar2(4000)

Wartość

 

Tabela pt_groups (zawiera informację o grupach)

Pole

Typ

Znaczenie

gr_id

number(10)

Identyfikator numeryczny grupy

gr_po_id

varchar2 (80)

Identyfikator portalu

gr_name

varchar2(30)

Nazwa grupy

gr_title

varchar2(60)

Tytuł

gr_description

varchar2(4000)

Opis grupy

gr_mod_date

Date

Data ostatniej modyfikacji danych grupy

gr_mod_user

varchar2(30)

Identyfikator alfanumeryczny użytkownika dokonującego zmian

 

Tabela pt_users_groups (zawiera informację o przynależności użytkowników do grup)

Pole

Typ

Znaczenie

ug_us_id

number(10)

Identyfikator numeryczny użytkownika

ug_gr_id

number(10)

ug_mod_date

Date

Data modyfikacji

ug_mod_user

varchar2(30)

Identyfikator alfanumeryczny użytkownika dokonującego zmian

 

2.2      Stan implementacji

 

Uniwersalny pakiet portalowy zaimplementowany jest w języku Java. Obecnie posiada interfejs dostępowy do Oracle-owej bazy danych i za jego pomocą są obsługiwane (pobierane i zapisywane) m.in. dane o użytkownikach portalu.

Dane użytkownika z tabeli pt_users są obsługiwane przez klasę PortalUser. Dane grupy z tabeli pt_groups są obsługiwane przez klasę UserGroup. Klasy PortalUser i UserGroup posiadają interfejs dostępowy do pól klasy (get/set) co pozwala na ich uniezależnienie od źródła danych (relacyjna baza danych, LDAP, ...). Klasa UserManagerDB zarządza ogółem użytkowników i grup mając bezpośredni dostęp do tabel w bazie Oracle-owej. Identyfikatory numeryczne są generowane przez mechanizm sekwencerów Oracle-owej bazy danych.


      Schemat poniżej ilustruje zależności między klasami (notacja Coad’a-Yourdon’a).

 

 

 

 

 

 

 

 

 

 

 

 


Klasa UserManagerBase jest abstrakcyjną klasą bazową dla klasy UserManagerDB. Deklaruje ona funkcjonalność zarządzania użytkownikami, która musi być zdefiniowana w klasach pochodnych. Funkcjonalnośc ta zostanie przedstawiona w następnym rozdziale przy opisie klasy obsługującej dane o użytkownikach przechowywane w bazie LDAP-owej. Dodanie obsługi nowego źródła danych o uzytkownikach będzie oznaczało implementację nowej klasy pochodnej klasy UserManagerBase, która będzie współpracowała z klasami PortalUser i UserGroup.


3         Projekt

 

Projekt zakłada wykonanie następujących zadań :

ˇ         utworzenie schematu bazy LDAP-owej (atrybuty i klasy obiektów oraz postać bazy katalogowej) jako repozytorium danych o użytkownikach portalu,

ˇ         rozwinięcie uniwersalnego pakietu portalowego o interfejs dostępowy do LDAP-owej bazy użytkowników,

ˇ         implementacja narzędzia służącego do skopiowania danych o użytkownikach z relacyjnej bazy danych do bazy katalogowej.

 

3.1      Schemat katalogowej bazy danych

 

Aby odwzorować strukturę danych istniejącą w relacyjnej bazie danych i zaadaptować ją
w bazie katalogowej zdefiniowane zostały następujące atrybuty i klasy obiektów (notacja z pliku *.ldif , OID zdefiniowane zostaną na etapie wdrożenia)

 

attributeTypes: ( psncGroupId-oid NAME 'psncGroupId'

                DESC 'PSNC Portal Group Id'

                SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE

                X-ORIGIN 'user defined')

 

attributeTypes: ( psncGroupTitle-oid NAME 'psncGroupTitle'

                DESC 'PSNC Portal Group Title'

                SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE

                X-ORIGIN 'user defined' )

 

attributeTypes: ( psncPropertyId-oid NAME 'psncPropertyId'

                DESC 'PSNC Portal User'

                SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE

                X-ORIGIN 'user defined')

 

attributeTypes: ( psncPropertyValue-oid NAME 'psncPropertyValue'

                DESC 'PSNC Portal User Property'

                SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE

                X-ORIGIN 'user defined' )

 

attributeTypes: ( psncUserId-oid NAME 'psncUserId'

                DESC 'PSNC Portal User Id'

                SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE

                X-ORIGIN 'user defined')

 

attributeTypes: ( psncUserEnabled-oid NAME 'psncUserEnabled'

                DESC 'PSNC Portal User Enable Flag'

                SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE

                X-ORIGIN 'user defined' )


 attributeTypes: ( psncUserAdmin-oid NAME 'psncUserAdmin'

                DESC 'PSNC Portal User Admin Flag'

                SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE

                X-ORIGIN 'user defined' )

 

attributeTypes: ( psncModDate-oid NAME 'psncModDate'

                DESC 'PSNC Portal Modification Date'

                SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE

                X-ORIGIN 'user defined')

 

attributeTypes: ( psncModUser-oid NAME 'psncModUser'

                DESC 'PSNC Portal Modification User'

                SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE

                X-ORIGIN 'user defined')

 

attributeTypes: ( psncLastLoginDate-oid NAME 'psncLastLoginDate'

                DESC 'PSNC Portal User'

                SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE

                X-ORIGIN 'user defined' )

 

attributeTypes: ( psncLoginDate-oid NAME 'psncLoginDate'

                DESC 'PSNC Portal User'

                SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE

                X-ORIGIN 'user defined')

 

 

 

objectClasses: ( psncportaluser-oid NAME 'psncportaluser'

                SUP top STRUCTURAL MUST ( givenName $ mail $ psncModDate $ psncUserAdmin $

                psncUserEnabled $ psncUserId $ sn $ uid $ userPassword )

                MAY ( mobile $ psncLastLoginDate $ psncLoginDate $ psncModUser )

                X-ORIGIN 'user defined' )

 

objectClasses: ( psncportaluserproperty-oid NAME 'psncportaluserproperty'

                SUP top STRUCTURAL MUST ( cn $ psncPropertyId $ psncPropertyValue )

                X-ORIGIN 'user defined' )

 

objectClasses: ( psncportalgroup-oid NAME 'psncportalgroup'

                SUP top STRUCTURAL

                MUST ( cn $ description $ psncGroupId $ psncGroupTitle $ psncModDate )

                MAY psncModUser

                X-ORIGIN 'user defined' )

 

objectClasses: ( psncportaluseringroup-oid NAME 'psncportaluseringroup'

                SUP top STRUCTURAL MUST ( psncModDate $ psncUserId $ seeAlso $ uid )

                MAY psncModUser

                X-ORIGIN 'user defined' )

 


Zbiór obiektów klasy psncPortalUser odpowiada krotkom w tabeli pt_users

(informacja o użytkownikach portalu)

Nr

Atrybut LDAP [typ]

Pole w tabeli [typ]

Znaczenie

1

psncUserId  [INTEGER]

us_id  [number(10)]

Identyfikator numeryczny użytkownika

2

nie jest potrzebny

us_po_id  [varchar2(80)]

Identyfikator portalu

3

uid  [DirectoryString]

us_login  [varchar2(30)]

Identyfikator alfanumeryczny użytkownika służący do jego logowania się w portalu

4

userPassword  [OctetString]

us_password  [varchar2(30)]

Hasło

5

psncUserEnabled  [Boolean]

us_enabled  [varchar2(10)]

Pole określające dostęp użytkownika do portalu (dozwolony lub zablokowany)

6

mail  [DirectoryString]

us_email  [varchar2(120)]

E-mail

7

mobile  [TelephoneNumber]

us_mobile  [varchar2(20)]

Telefon komórkowy

8

givenname  [DirectoryString]

us_fname  [varchar2(60)]

Imię

9

sn  [DirectoryString]

us_sname  [varchar2(120)]

Nazwisko

10

psncUserAdmin  [Boolean]

us_admin  [varchar2(10)]

Pole określające czy użytkownik jest administratorem

11

psncModDate  [DirectoryString]

 

us_mod_date  [date]

Data ostatniej modyfikacji danych użytkownika

12

psncModUser  [DirectoryString]

us_mod_user  [varchar2(30)]

Identyfikator alfanumeryczny użytkownika zmieniającego dane

13

psncLoginDate  [DirectoryString]

us_login_date  [date]

Data ostatniego zalogowania użytkownika w portalu

14

psncLastLoginDate  [DirectoryString]

us_last_login_date  [date]

Data poprzedniego zalogowania użytkownika w portalu

 

Zbiór obiektów klasy psncPortalUserProperty odpowiada krotkom w tabeli pt_user_props

(zawiera dodatkowe własności użytkownika)

Nr

Atrybut LDAP [typ]

Pole w tabeli [typ]

Znaczenie

1

psncPropertyId  [INTEGER]

up_id  [number(10)]

Identyfikator numeryczny własności

2

nie jest potrzebny

up_us_id  [number(10)]

Identyfikator numeryczny użytkownika

3

cn  [DirectoryString]

up_name  [varchar2(250)]

Nazwa własności

4

psncPropertyValue [DirectoryString]

us_value  [varchar2(4000)]

Wartość

 

Zbiór obiektów klasy psncPortalGroup odpowiada krotkom w tabeli pt_groups

(zawiera informację o grupach)

Nr

Atrybut LDAP [typ]

Pole w tabeli [typ]

Znaczenie

1

psncGroupId  [INTEGER]

2

nie jest potrzebny

gr_po_id  [varchar2 (80)]

Identyfikator portalu

3

cn  [DirectoryString]

gr_name  [varchar2(30)]

Nazwa grupy

4

psncGroupTitle  [DirectoryString]

gr_title  [varchar2(60)]

Tytuł

5

description  [DirectoryString]

gr_description  [varchar2(4000)]

Opis grupy

6

psncModDate  [DirectoryString]

gr_mod_date  [date]

Data ostatniej modyfikacji danych grupy

7

psncModUser  [DirectoryString]

gr_mod_user  [varchar2(30)]

Identyfikator alfanumeryczny użytkownika dokonującego zmian

 

Zbiór obiektów klasy  psncPortalUserInGroup odpowiada krotkom w tabeli pt_users_groups

(zawiera informację o przynależności użytkowników do grup)

Nr

Atrybut LDAP [typ]

Pole w tabeli [typ]

Znaczenie

1

psncUserId [INTEGER]

ug_us_id  [number(10)]

Identyfikator numeryczny użytkownika

2

Nie jest potrzebny

ug_gr_id  [number(10)]

Identyfikator numeryczny grupy

3

psncModDate  [DirectoryString]

ug_mod_date  [date]

Data modyfikacji

4

psncModUser  [DirectoryString]

ug_mod_user  [varchar2(30)]

Identyfikator alfanumeryczny użytkownika dokonującego zmian

5

uid  [DirectoryString]

brak

Identyfikator alfanumeryczny użytkownika

6

seeAlso  [DN]

Brak

DN wskazujący na obiekt opisujacy użytkownika

 

 

            Przyjęto dla poszczególnych klas następujące atrybuty wykorzystywane w relatywnej nazwie wyróżnionej (RDN) :


Na rysunku poniżej przedstawiona jest koncepcja drzewa katalogowego zawierającego dane o użytkownikach portalu.

 

 

 

 

 

 

 

 

 

 

 

 

 


Pierwszy poziom drzewa (dc=interklasa,dc=pl) stanowi korzeń drzwa katalogowego (tzw. Root DN). Na drugim poziomie został zdefiniowany podział na dwa katalogi. Podkatalog ou=People zawiera poniżej obiekty opisujące użytkowników (obiekty klasy psncPortalUser). Podkatalog ou=Groups zawiera poniżej obiekty opisujące grupy (obiekty klasy psncPortalGroup). Na czwartym poziomie pod każdym obiektem opisującym użytkownika (np. DN : uid=user_1, ou=People, dc=interklasa, dc=pl) znajdują się obiekty opisujące własności użytkownika (obiekty klasy psncPortalUserProperty). Również na czwartym poziomie, pod każdym obiektem opisującym grupę (np. DN : cn=group_1, ou=Groups, dc=interklasa, dc=pl) znajdują się obiekty wskazujące użytkowników należących do danej grupy (obiekty klasy psncPortalUserInGroup).

 

3.2      Interfejs dostępowy do danych w bazie katalogowej

 

Drugim zadaniem w projekcie jest rozwinięcie uniwersalnego pakietu portalowego o interfejs dostępowy do LDAP-owej bazy użytkowników. Interfejs ten musi posiadać funkcjonalność deklarowaną w klasie bazowej UserManagerBase poprzez funkcje deklarowane jako abstrakcyjne - muszą być zdefiniowane w klasie pochodnej ( zachowana jest identyczność deklaracji funkcji w klasach pochodnych, wykonujących te same zadania ). Takie założenie powoduje zminimalizowanie implementacji w części pakietu portalowego wykorzystującego interfejs zarządzania użytkownikami. Funkcjonalność, którą spełniać będzie nowy interfejs to :

ˇ         pobieranie nowego identyfikatora numerycznego generowanego przez mechanizm sekwencera bazy Oracle’owej,

ˇ         pobieranie danych o pojedynczym użytkowniku o podanym login'ie lub identyfikatorze numerycznym,

ˇ         pobieranie danych wszystkich użytkowników,

ˇ         przeszukiwanie bazy uzytkowników, gdzie parametrem jest łańcuch znaków, a atrybutami sprawdzanymi mogą być login, nazwisko użytkownika lub jego e-mail,

ˇ         dokonywanie autentykacji użytkownika portalu na podstawie jego identyfikatora alfanumerycznego (login) i hasła,

ˇ         zmiana hasłą użytkownika portalu,

ˇ         dodawanie, usuwanie oraz modyfikacja danych użytkownika portalu,

ˇ         pobieranie informacji o własnościach użytkownika,

ˇ         definiowanie oraz usuwanie własności użytkownika portalu,

ˇ         pobieranie nazw wszystkich zdefiniowanych własności użytkownika portalu,

ˇ         pobieranie danych użytkowników znajdujących się w danej grupie,

ˇ         pobieranie informacji o wszystkich grupach w jakich znajduje się dany użytkownik,

ˇ         pobieranie informacji o wszystkich zdefiniowanych w portalu grupach,

ˇ         pobieranie informacji o grupie o podanej nazwie lub identyfikatorze alfanumerycznym,

ˇ         dodawanie, usuwanie oraz modyfikacja danych grupy,

ˇ         dodawanie oraz usuwanie użytkownika portalu z grupy,

 

Klasa realizująca przedstawioną powyżej funkcjonalność została nazwana UserManagerLDAP, dziedziczy z klasy UserManagerBase i podobnie jak klasa UserManagerDB, będzie wykorzystywać już zaimplementowane klasy PortalUser i UserGroup do obsługi danych użytkowników portalu i danych grup. Rysunek poniżej przedstawia powiązania między nową klasą, a już istniejącymi klasami.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


W implementacji wykorzystany będzie pakiet Netscape Directory SDK for Java 4.0 [2] stanowiący warstwę pośrednią między fizyczną bazą LDAP, a implementowanym interfejsem dostępowym do danych użytkowników portalu.

Podobnie jak w interfejsie dostępowym do Oracle'owej bazy danych, także tutaj użyty będzie mechanizm puli połączeń w tym przypadku do bazy LDAP-owej. W tym celu zastosowana zostanie standardowa klasa pakietu Netscape'a - klasa ConnectionPool.

 

3.3      Implementacja narzędzia do transferu danych użytkowników portalu Interkl@sa z relacyjnej bazy danych do bazy katalogowej

 

Ostanim zadaniem projektu jest implementacja programu, który :

1.       przygotuje szkielet drzewa danych w bazie LDAP-owej,

2.       odczyta dane o użytkownikach i grupach (dane z tabel pt_users i pt_groups) i umieści je w obiektach PortalUser i UserGroup.

3.       zapisze dane z klas PortalUser i UserGroup do LDAP-owej bazy danych,

4.       odczyta własności każdego użytkownika portalu z relacyjnej bazy danych (tabela pt_user_props) i zapisze je do bazy LDAP-owej (pod obiektem użytkownika),

5.       odczyta informację o przynależności użytkowników portalu w grupach z bazy Oracle’owej (tabela pt_users_groups) i zapisze ją do bazy LDAP-owej jako obiekty pod obiektami grup w hierarchii drzewa.

 

Program wykorzysta klasy UserManagerDB (do współpracy z bazą Oracle-ową) oraz nową klasę UserManagerLDAP (do współpracy z bazą LDAP-ową).

 


Bibliografia

 

[ 1 ]

T.A. Howes, M.C. Smith, G.S. Good  "Understanding and Deploying LDAP Directory Services", 1999

[ 2 ]

Netscape Directory SDK for Java http://developer.netscape.com/tech/directory/index.html