Przeboje z J2EE

Filed under Java by Łukasz Dywicki

Nigdy bym nie pomyślał, że stworzenie nowej aplikacji w oparciu o J2EE będzie tak trudne. A jednak, mimo wszystko, jest!

Zachwycony prostotą rozwiązania wbudowanego w standard, mianowicie roli i mapowania adresów, postanowiłem je wykorzystać. JSF mimo całej swej wspaniałości, mechanizmu autoryzacji nie dostarcza.

Autoryzacja i deskryptor

Może teraz nieco więcej o tym jak wygląda autoryzacja…

<web_app>
	<security_constraint>
		<web_resource_collection>
			<web_resource_name>Admin</web_resource_name>
			<url_pattern>/admin/*</url_pattern>
		</web_resource_collection>
		<auth_constraint>
			<role_name>ADMIN</role_name>
		</auth_constraint>
	</security_constraint>		

	<security_constraint>
		<web_resource_collection>
			<web_resource_name>Student</web_resource_name>
			<url_pattern>/student/*</url_pattern>
		</web_resource_collection>
		<auth_constraint>
			<role_name>STUDENT</role_name>
		</auth_constraint>
	</security_constraint>

	<security_role>
		<role_name>ADMIN</role_name>
	</security_role>
	<security_role>
		<role_name>STUDENT</role_name>
	</security_role>

	<login_config>
		<auth_method>FORM</auth_method>
		<realm_name>swe-realm</realm_name>
		<form_login_config>
			<form_login_page>/login.jsp</form_login_page>
			<form_error_page>/login.jsp</form_error_page>
		</form_login_config>
	</login_config>
</web_app>

Taki fragment w pliku web.xml oraz odpowiedni formularz umożliwiają wykorzystanie autoryzacji, którą obsługuje serwer. Jedyne co trzeba skonfigurować to swe-realm, tak by serwer wiedział skąd pobierać dane o użytkownikach i rolach.

Był sobie realm

Ano był sobie realm. Większość serwerów ma wbudowany zestaw realmów, które wystarczy skonfigurować by ich używać. Bilans kilkudniowych walk w przypadku Glassfisha i Geronimo jest zbieżny – żaden ze standardowych mechanizmów nie potrafi sobie poradzić z PostgreSQL. Zadziwiające nieprawdaż? W tym gąszczu standardów implementacje chyba się rozjechały, albo są po prostu kiepsko napisane, bo kwestia rozbija się o złe quoty w zapytaniach (wszędzie na chama lecą cudzysłowy, a dla PostgreSQL tak są ‘cytowane’ kolumny). Zatem zarówno Geronimo i Glassfish nie obsługuje poprawnie autoryzacji pod wybraną przeze mnie bazą danych. Znalazłem obejście dla Glassfisha – ktoś sam zaimplementował JDBCRealm. Po drobnych poprawkach i przekompilowaniu, tak by był on zgodny z aktualną wersją serwera uruchomiłem serwer.. Właściwie chciałbym go uruchomić, bo cóż się okazało? Ano problemy z classpathem. O zgrozo!

To już jest koniec historii

Żeby było zabawniej, można stworzyć sobie własny moduł logowania w oparciu o JAAS, wystarczy implementacja jednego interfejsu, jakkolwiek Glassfish wymusza rozszerzanie własnych klas. Z Geronimo póki co mam problem, ponieważ te wymaga bym tworzył dodatkowe deskryptory, czego ja oczywiście nie potrafię..

Był sobie standard, były sobie implementacje, pozostał zrozpaczony developer. :|

3 responses so far

3 Responses to “Przeboje z J2EE”

  1. Ace says:

    Kochane j2ee ;)

  2. Pawel Krefta says:

    Znakomita plenta – dot. zreszta nie tylko Javy : ]

  3. shagrat says:

    spróbuj acegi security, jeśli masz dość zarządzania autoryzacją przez glassfishe czy tomcaty. ogólnie jeśli miałbym się czepiać czegoś w webowej javie, to właśnie tak zaprojektowanej filozofii autoryzacji, o której ludzie mający N lat zabaw z javą więcej ode mnie nie mają, łagodnie mówiąc, najlepszego zdania…

Leave a Reply