<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>j2ee.pl - związani z javą &#187; autoryzacja</title>
	<atom:link href="http://j2ee.pl/tag/autoryzacja/feed/" rel="self" type="application/rss+xml" />
	<link>http://j2ee.pl</link>
	<description>związani z Javą</description>
	<lastBuildDate>Mon, 24 Aug 2009 11:45:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Acegi &#8211; Uwierzytelnianie i Autoryzacja w Springu</title>
		<link>http://j2ee.pl/2007/08/29/acegi-uwierzytelnianie-i-autoryzacja-w-springu/</link>
		<comments>http://j2ee.pl/2007/08/29/acegi-uwierzytelnianie-i-autoryzacja-w-springu/#comments</comments>
		<pubDate>Wed, 29 Aug 2007 14:06:39 +0000</pubDate>
		<dc:creator>Michał Gołacki</dc:creator>
				<category><![CDATA[Inne biblioteki]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[acegi]]></category>
		<category><![CDATA[autoryzacja]]></category>
		<category><![CDATA[bezpieczeństwo]]></category>
		<category><![CDATA[uwierzytelnianie]]></category>

		<guid isPermaLink="false">http://j2ee.pl/2007/08/29/acegi-uwierzytelnianie-i-autoryzacja-w-springu/</guid>
		<description><![CDATA[
Acegi jest to narzędzie służące zapewnieniu bezpieczeństwa w aplikacjach korporacyjnych. Zapewnia wszechstronne mechanizmy uwierzytelniania i autoryzacji.

Uwierzytelnianie i Autoryzacja
Są to podstawowe elementy zapewnienia bezpieczeństwa w aplikacji sieciowej. Uwierzytelnianie polega na potwierdzeniu tożsamości użytkownika, zwykle poprzez podanie loginu i hasła. Autoryzacja oznacza przyznanie określonemu użytkownikowi dostępu do pewnych zasobów.
Przykładowa Aplikacja
Kod źródłowy przykładowej aplikacji możecie pobrać tu. Wersja [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.acegisecurity.org/"><img src="http://j2ee.pl/wp-content/uploads/2007/08/logo.gif" height="144" width="216" /></a></p>
<p>Acegi jest to narzędzie służące zapewnieniu bezpieczeństwa w aplikacjach korporacyjnych. Zapewnia wszechstronne mechanizmy uwierzytelniania i autoryzacji.</p>
<p><span id="more-81"></span></p>
<h3>Uwierzytelnianie i Autoryzacja</h3>
<p>Są to podstawowe elementy zapewnienia bezpieczeństwa w aplikacji sieciowej. Uwierzytelnianie polega na potwierdzeniu tożsamości użytkownika, zwykle poprzez podanie loginu i hasła. Autoryzacja oznacza przyznanie określonemu użytkownikowi dostępu do pewnych zasobów.</p>
<h3>Przykładowa Aplikacja</h3>
<p>Kod źródłowy przykładowej aplikacji możecie pobrać <a href="http://j2ee.pl/wp-content/uploads/2007/08/acegidemo-acegi.zip">tu</a>. Wersja bez Acegi jest dostępna <a href="http://j2ee.pl/wp-content/uploads/2007/08/acegidemo.zip">tutaj</a>.</p>
<h3>Acegi</h3>
<p>Działanie Acegi polega na zastosowaniu szeregu filtrów. Dbają one o to aby użytkownik uzyskał dostęp do tych elementów, do których ma prawo. Działanie rozpoczyna sprawdzenie czy dany zasób jest zabezpieczony. Następnie sprawdza się czy użytkownik jest już zalogowany, jeśli nie zostanie o to poproszony w tym momencie. Po poprawnym zalogowaniu sprawdza się czy jest możliwy dostęp do zasobu, a następnie go udostępnia.</p>
<h3>Konfiguracja</h3>
<h4>FilterChainProxy</h4>
<p>Do połączenia zestawu filtrów w spójnie działającą całość użyjemy FilterChainProxy. Obiekt ten zajmie się utworzeniem i przygotowaniem potrzebnych filtrów.</p>
<pre class="prettyprint">&lt;bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"&gt;
	&lt;property name="filterInvocationDefinitionSource"&gt;
		&lt;value&gt;CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
			PATTERN_TYPE_APACHE_ANT
			/**=httpSessionContextIntegrationFilter,
			formAuthenticationProcessingFilter,exceptionTranslationFilter,
			filterSecurityInterceptor&lt;/value&gt;
	&lt;/property&gt;
&lt;/bean&gt;</pre>
<p>Parametr filterInvocationDefinitionSource zapewnia przygotowanie poprawnych adresów oraz definiuje listę filtrów do zestawienia. Teraz przejdźmy do konfiguracji poszczególnych elementów.</p>
<h4>AutenticationProcessingFilter</h4>
<pre class="prettyprint">&lt;bean id="formAuthenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"&gt;
	&lt;property name="authenticationManager" ref="authenticationManager" /&gt;
	&lt;property name="authenticationFailureUrl" value="/badlogin.jsp" /&gt;
	&lt;property name="defaultTargetUrl" value="/" /&gt;
	&lt;property name="filterProcessesUrl" value="/j_acegi_security_check" /&gt;
&lt;/bean&gt;</pre>
<p>Pierwszy filtr, do którego przyjdzie żądanie. Filtr ten zajmie się uwierzytelnieniem użytkownika poprzez wyświetlenie formularza z prośbą o podanie loginu i hasła, jednak nie zajmuje się potwierdzeniem ich poprawności. Te funkcje znajdziemy w kolejnych elementach.</p>
<h4>HttpSessionContextIntegrationFilter</h4>
<pre class="prettyprint">&lt;bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"&gt;
&lt;/bean&gt;</pre>
<p>Proste zadanie tego bean&#8217;a polega na przekazywaniu informacji dotyczących uwierzytelnienia pomiędzy kolejnymi żądaniami.</p>
<h4>ExceptionTranslationFilter</h4>
<p>Zadaniem tego komponentu jest przechwytywanie wyjątków związanych z uwierzytelnianiem i autoryzacją. Jeśli użytkownik jest niezalogowany, wyświetlony zostanie ekran logowania. Jeśli użytkownik był już zalogowany, ale nie ma praw dostępu do danego zasobu, do przeglądarki zostanie zwrócony komunikat 403 Forbidden.</p>
<pre class="prettyprint">&lt;bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter"&gt;
	&lt;property name="authenticationEntryPoint"&gt;
		&lt;ref bean="formLoginAuthenticationEntryPoint" /&gt;
	&lt;/property&gt;
&lt;/bean&gt;</pre>
<h4>FieldSecurityInterceptor</h4>
<p>Bean zawierający informacje o zabezpieczonych zasobach.  Ograniczenia dostępu definiujemy za pomocą ścieżek URL. Definiujemy je w objectDefinitionSource.</p>
<pre class="prettyprint">&lt;bean id="filterSecurityInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor"&gt;
	&lt;property name="authenticationManager"&gt;
		&lt;ref bean="authenticationManager" /&gt;
	&lt;/property&gt;
	&lt;property name="accessDecisionManager"&gt;
		&lt;ref bean="accessDecisionManager" /&gt;
	&lt;/property&gt;
	&lt;property name="objectDefinitionSource"&gt;
		&lt;value&gt;
			CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
			PATTERN_TYPE_APACHE_ANT
			/secure/admin/*=ROLE_ADMIN
			/secure/user/*=ROLE_USER
		&lt;/value&gt;
	&lt;/property&gt;
&lt;/bean&gt;</pre>
<p>W powyższym przykładzie widzimy zdefiniowane dwie ścieżki. Do każdej z nich została przypisana inna rola. Użytkownicy z posiadający dostęp do jednej z nich będą posiadali dostęp do jednej ścieżki.</p>
<h4>AuthenticationManager</h4>
<pre class="prettyprint">&lt;bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"&gt;
	&lt;property name="providers"&gt;
		&lt;list&gt;
			&lt;ref bean="daoAuthenticationProvider" /&gt;
		&lt;/list&gt;
	&lt;/property&gt;
&lt;/bean&gt;</pre>
<p>Jak widać konfiguracja samego managera zawiera jedynie źródło danych, potrzebnych do weryfikacji użytkownika. Źródłem danych może być JDBC lub LDAP. W tym przypadku pokażę jednak jak skorzystać z prostego źródła InMemoryDaoImpl. Pozwala ono definiować użytkowników w springowym xml’u. Poniżej konfiguracja:</p>
<pre class="prettyprint">&lt;bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"&gt;
	&lt;property name="userDetailsService"&gt;
		&lt;ref bean="userDetailsProvider" /&gt;
	&lt;/property&gt;
&lt;/bean&gt;</pre>
<pre class="prettyprint">&lt;bean id="userDetailsProvider" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl"&gt;
	&lt;property name="userMap"&gt;
		&lt;value&gt;
			admin=acegi,ROLE_ADMIN
			user=security,ROLE_USER
			root=demo,ROLE_ADMIN,ROLE_USER
		&lt;/value&gt;
	&lt;/property&gt;
&lt;/bean&gt;</pre>
<p>Mamy tu zdefiniowanych trzech użytkowników, jeden z nich ma przypisane dwie role. Będzie on miał dostęp do zasobów przeznaczonych dla każdej z nich.</p>
<h4>AccessDecisionManager</h4>
<p>Komponent odpowiedzialny za ustalenie czy dany użytkownik ma prawo dostępu do danego zasobu. Do podjęcia decyzji używany jest RoleVoter.</p>
<pre class="prettyprint">&lt;bean id="accessDecisionManager" class="org.acegisecurity.vote.UnanimousBased"&gt;
	&lt;property name="decisionVoters"&gt;
		&lt;list&gt;
			&lt;ref bean="roleVoter" /&gt;
		&lt;/list&gt;
	&lt;/property&gt;
&lt;/bean&gt;</pre>
<pre class="prettyprint">&lt;bean id="roleVoter" class="org.acegisecurity.vote.RoleVoter"&gt;
	&lt;property name="rolePrefix"&gt;
		&lt;value&gt;ROLE_&lt;/value&gt;
	&lt;/property&gt;
&lt;/bean&gt;</pre>
<h4>AuthenticationEntryPoint</h4>
<p>Element odpowiedzialny za zdefiniowanie formularza logowania. Za jego pomocą możemy również wymusić przesyłanie loginu i hasła za pomocą https, ustawiając property forceHttps na true.</p>
<pre class="prettyprint">&lt;bean id="formLoginAuthenticationEntryPoint" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"&gt;
	&lt;property name="loginFormUrl"&gt;
		&lt;value&gt;/login.jsp&lt;/value&gt;
	&lt;/property&gt;
&lt;/bean&gt;</pre>
<h4>Ekran logowania</h4>
<pre class="prettyprint">
&lt;form method="POST" action="&lt;c:url value='j_acegi_security_check' /&gt;" &gt;
	Username: &lt;input type="text" name="j_username"&gt;&lt;br&gt;
	Password: &lt;input type="password" name="j_password"&gt;&lt;br&gt;
	&lt;input type="submit" &gt;
&lt;/form&gt;</pre>
<h3>Podsumowanie</h3>
<p>Jak widać przygotowanie uwierzytelniania za pomocą Acegi nie jest szczególnie skomplikowane. Praktycznie cała konfiguracja jest zawarta w Springowych plikach XML i nie powinna sprawić nikomu kłopotów. Polecam korzystanie z Acegi przy aplikacjach o małych i średnich wymogach bezpieczeństwa. Jeśli korzystacie jednocześnie z SiteMesh upewnijcie się, że filtry Acegi wywoływane są jako pierwsze.</p>
]]></content:encoded>
			<wfw:commentRss>http://j2ee.pl/2007/08/29/acegi-uwierzytelnianie-i-autoryzacja-w-springu/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
