Monday, July 21, 2008

Autorizácia v JSF

Autorizácia v JSF

Tento článok oboznámi čitateľa s možnosťou autorizácie užívateľov vrámci JSF za pomoci knižnice jReCo. Ako nastaviť a ako používať jReCo je mimo rámec tohto článku. Podrobné informácie k tejto téme nájdete v manuáli na http://www.sapharee.com/jreco .

Autorizovať užívateľa vrámci aplikácie znamená vyčleniť mu časti aplikácie, ku ktorým má prístup. Zľahčene povedané, ak je užívateľ administrátor, uvidí z aplikácie viac ako bežný užívateľ.

Bezpečnostný model JSF nie je nič moc a pokial si chce programátor vyrobiť aplikáciu, ktorá rešpektuje práva prihláseného užívateľa, musí siahnuť po rôznych invazívnych metódach. Najkôr asi siahne priamo do kódu v Jave, kde podľa užívateľských práv nastaví korešpondujúce booleanovské attribúty a na ne „zavesí“ rendered atribút JSF komponet. Poprípade použije knižnicu s komponentami, ktoré umožňujú pridávať informáciu o užívateľských roliach priamo do definície komponenty v JSF kóde.

Takéto a podobné metódy sú vporiadku ak dopredu vieme, že naša aplikácia je pomerne jednoduchá a štruktúra práv sa nebude veľmi meniť.

V prípade zložitejších aplikácií s množstvom komponent a pravidiel pre ich zobrazovanie je lepšie siahnuť po nejakom frameworku, ktorý oddelí definíciu autorizačných pravidiel od aplikačného kódu.

Pre neinvazívny spôsob kontrolovania stavu zobrazenia komponent v JSF aplikácii môžeme využiť knižnicu jReCo (JSF Rendering Controller). Táto knižnica funguje ako plugin, ktorý vsunieme do našej aplikácie a buď dovolíme, aby jReCo ovládalo aplikáciu plne automaticky, alebo necháme na programátora, aby sa sám rozhodol, kedy má jReCo vyhodnotiť pravidlá a na základe výsledkov upraviť stav komponent.

Na to aby jReCo mohlo fungovať, musia byť splnené dve podmienky.

1. Každá komponenta, ktorá sa zobrazuje a chceme kontolovať jej stav zobrazenia, musí mať na strane Javy v Backing beane svoju vlastnú inštanciu vo forme atribútu triedy. Tento atribút by mal byť súkromný a mal by mať svoju get a set metódu.

2. JSF komponenta v JSF kóde sa musí odkazovať (binding) na atribút z predchádzajúcej podmienky.


Článok sa zaoberá autorizáciou uživateľa a preto nebudem zachádzať do podrobností a možností jReCo knižnice. Ostatné informácie nájdete na stánkach tejto knižnice.

Definícia pravidiel prebieha v súboroch s príponou .jreco. Tie súbory štandardne umiestňujeme do WEB-INF adresára.

Pre účely tohto článku postačuje vysvetlnie následujúcej definícuie pravidla:

(bean.atribút1, bean.atribút2){
isUserInRole[názov_role1, názov_role2]
}

V zátvorkách uvedieme referencie na atribúty, ktoré chceme, aby boli kontrolované pravidlom definovaným v zložených zátvorkách.

Pravidlo samotné je definované volaním registrovanej metódy. Táto metóda, ktorej názov prezrádza, že bude kontrolovať užívateľove role oproti zoznamu rolí v hranatých zátvorkách, plní potrebu autorizácie užívateľov. V prípade, že užívateľ vlastní jednu z čiarkou oddedlených rolí, metóda vráti true a komponenty budú zobrazené.

Ak by nastal prípad, že užívateľ musí byť vlastníkom dvoch rolí naraz, zmeníme našu podmienku následovne:

(bean.atribút1, bean.atribút2){
isUserInRole[názov_role1] && isUserInRole[názov_role2]
}


Takýchto definícií môžeme nadefinovať ľubovoľné množstvo. Odkazy na atribúty (komponenty) sa môžu nachádzať v niekoľkých pravidlách naraz a platí, že akonáhle je jeden z výrazov vyhodnotený pozitívne, komponenta je zobrazená.

Je treba tiež podotknúť, že jReCo vie zobrazovať komponenty dvojakým spôsob. Ten prvý, štandardný, komponentu buď zobrazí, alebo nezobrazí. Druhý spôsob zobrazenia je komponentu ponechať viditeľnou, ale znemožniť na ňu prístup (disable).

Pridaním „*“ za odkaz na komponentu povieme, že komponenta sa má zobraziť, ale nemá byť prístupná.

Ako príklad použijem upravenú predchádzajúcu definíciu:

(bean.atribút1*, bean.atribút2*){
isUserInRole[názov_role1] && isUserInRole[názov_role2]
}



Máme definíciu, ale ako sa vyhodnotí metóda isUserInRole? Keď nahliadneme do definície tejto metódy, uvidíme, že sa spolieha na ExternalContext.isUserInRole(). Aby táto fungovala správne, musí mať webový kontajner správne nastavenú bezpečnosť (security). Tento článok sa však nastavením bezpečnosti na webových servroch nezaoberá a môžem vás iba nasmerovať napríklad na http://tomcat.apache.org/tomcat-6.0-doc/realm-howto.html , kde sa dozviete, ako nastaviť security pre Tomcat.

Nie každému však bude vyhovovať používanie security definovaniej priamo vo webovom servri. jReCo umožňuje vytvorenie vlastnej metódy (registered method), ktorú budeme vrámci autorizácie používať. jReCo manuál obsahuje popis, ako takúto metódu vytvoriť a zaregistrovať.

Tuesday, June 17, 2008

JSF user authorizing and more..

Some time ago I had a need to build up user interface depending on the roles that the logged in user possessed. Thought it would be easy to find some library to do this kind of a job. I found few techniques but didn't like any of them. They were not flexible enough and required coding in JSF or Java.

So I started experimenting a bit with JSF. The experiment ended with a library called jReCo that goes far beyond user authorization. It's a rule engine for JSF developers that can help with user authorization as well.

The idea was to control the rendering state of components from the outside. The rules that resembel Java like code are defined in a separate file. The developer may choose between fully automatic control or he may invoke the engine from his own code.

jReCo should be functional with all JSF component frameworks. If the rules change the engine can pick up the changes without the need to restart the server.

To download and learn more visit http://www.sapharee.com/jreco

I'll be very glad if I get some feedback from you!

Links:
JSF authorization