|
Poznańskie
Centrum Superkomputerowo - Sieciowe |
PROJEKT LDAP |
|
Projekt przeniesienia informacji o użytkownikach
aplikacji portalowej Jerzy Chochulski Mirosław Czyrnek |
|
Poznań 2003 |
Spis treści
2 Aktualny
stan implementacji.
2.1 Relacyjna baza danych - struktura
danych
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
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.
W niniejszym rozdziale przedstawiony jest aktualny
stan implementacji zarządzania użytkownikami w uniwersalnym pakiecie
portalowym.
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 |
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
Coada-Yourdona).
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.
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.
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).
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
Oracleowej,
ˇ
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.
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 Oracleowej
(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ą).
[ 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 |