Wyklad10(SpringSecurity)

Download Report

Transcript Wyklad10(SpringSecurity)

Projektowanie warstwy serwera
Acegi
Projektowanie warstwy serwera
Acegi
• Acegi jest to narzędzie służące zapewnieniu
bezpieczeństwa w aplikacjach korporacyjnych.
• Zapewnia wszechstronne mechanizmy
uwierzytelniania i autoryzacji.
• 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.
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
2
Projektowanie warstwy serwera
Zalety Acegi
•
•
•
•
•
Open Source
Elastyczność
Uniwersalność
Przezroczystość
Oferuje szeroki zakres usług związanych z
bezpieczeństwem
• Nie wymaga ingerencji w logikę biznesowa
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
3
Projektowanie warstwy serwera
Budowa
• Głównym obiektem jest SecurityContextHolder przechowujący dane
związane z bezpieczeństwem
• HttpSessionContextIntegrationFilter – dba o to, by
SecurityContextHolder był przechowywany miedzy kolejnymi żądaniami
HTTP
• AuthenticationProvider – jego zadaniem jest utworzenie właściwego
obiektu Authentication, w przypadku podania przez użytkownika
prawidłowych danych uwierzytelniających
• AccessDecisionManager – zarządza podejmowaniem decyzji, czy
zalogowany użytkownik ma prawa do żądanego zasobu
• AccessDecisionVoter – obiekt wykorzystywany przez
AccessDecisionManager do podejmowania decyzji autoryzacyjnych
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
4
Projektowanie warstwy serwera
Authentication (I)
public static String getLogin()
{
Authentication authentication =
SecurityContextHolder.getContext().getAuthentication();
Object obj = authentication.getPrincipal();
if (obj instanceof UserDetails)
{
UserDetails ud = (UserDetails) obj;
return ud.getUsername();
}
throw new SecurityException("unknown UserDetails");
}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
5
Projektowanie warstwy serwera
6
Authentication (II)
public static String[] getRoles()
{
Authentication authentication =
SecurityContextHolder.getContext().getAuthentication();
if (authentication == null)
throw new ACLSecurityException("user not authenicated");
GrantedAuthority[] ga = authentication.getAuthorities();
ArrayList<String> lista = new ArrayList<String>();
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Projektowanie warstwy serwera
Authentication (III)
for (int i = 0; i < ga.length; i++)
{
String s = ga[i].getAuthority();
if (s.startsWith("Role_"))
lista.add(s);
}
return (String[]) lista.toArray(new String[0]);
}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
7
Projektowanie warstwy serwera
Pobieranie zalogowanego użytkownika
public Uzytkownik getZalogowanyUzytkownik()
{
Uzytkownik uzytkownik =
uzytkownikDAO.getByLogin(
BibliotekaThreadContext.getLogin());
return uzytkownik;
}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
8
Projektowanie warstwy serwera
authz:authorize
<authz:authorize
ifAnyGranted="Dyrektor,Student,Nauczyciel">
.....
</authz:authorize>
ifAllGranted
ifAnyGranted
ifNotGranted
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
9
Projektowanie warstwy serwera
10
Konfiguracja
• Acegi Security opiera swe działanie na pewnej
grupie filtrów, które dostarczają odpowiednich usług
związanych z bezpieczeństwem
• Filtry należy zdefiniować w pliku web.xml
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Projektowanie warstwy serwera
Filtry - konfiguracja (I)
<filter>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<filter-class>
org.acegisecurity.util.FilterToBeanProxy
</filter-class>
<init-param>
<param-name>targetBean</param-name>
<param-value>filterChainProxy</param-value>
</init-param>
</filter>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
11
Projektowanie warstwy serwera
Filtry - konfiguracja (II)
<filter-mapping>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>charsetFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
12
Projektowanie warstwy serwera
13
FilterChainProxy
<bean id="filterChainProxy"
class="org.acegisecurity.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
/**=httpSessionContextIntegrationFilter,securityContextHolderAwareReque
stFilter,anonymousProcessingFilter,formAuthenticationProcessingFilter,a
uthenticationProcessingFilter,exceptionTranslationFilter,filterSecurityInte
rceptor,logoutFilter
/security/**= httpSessionContextIntegrationFilter, ....
</value>
</property> </bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Kolejność filtrów
•
•
•
•
•
•
•
•
•
Projektowanie warstwy serwera
ConcurrentSessionFilter
HttpSessionContextIntegrationFilter
SecurityContextHolderAwareRequestFilter
AnonymousProcessingFilter
filtry odpowiedzialne za proces uwierzytelniania
ExceptionTranslationFilter
ForceChangePassword
FilterSecurityInterceptor
LogoutFilter
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
14
Projektowanie warstwy serwera
Konfiguracja filtrów (I)
• Liczba aktywnych sesji dla jednego użytkownika
<bean id="concurrentSessionController"
class="org.springframework.security.concurrent.
ConcurrentSessionControllerImpl">
<property name="maximumSessions" value="1" />
<property name="exceptionIfMaximumExceeded"
value="false"></property>
<property name="sessionRegistry" ref="sessionRegistry"/>
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
15
Projektowanie warstwy serwera
Konfiguracja filtrów (II)
<bean id="concurrentSessionFilter"
class="org.springframework.security.concurrent.
ConcurrentSessionFilter">
<property name="expiredUrl”
value="/logowanie.html?login_error=2"/>
<property name="sessionRegistry" ref="sessionRegistry"/>
</bean>
<bean id="sessionRegistry"
class="org.springframework.security.concurrent.
SessionRegistryImpl" />
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
16
Projektowanie warstwy serwera
Konfiguracja filtrów (III)
• Przechowanie zalogowanego użytkownika w sesji
<bean id="httpSessionContextIntegrationFilter"
class="org.springframework.security.context.
HttpSessionContextIntegrationFilter">
<property name="contextClass">
<value>org.springframework.security.context.
SecurityContextImpl</value>
</property>
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
17
Projektowanie warstwy serwera
Konfiguracja filtrów (IV)
<bean id="securityContextHolderAwareRequestFilter"
class="org.acegisecurity.wrapper.
SecurityContextHolderAwareRequestFilter" />
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
18
Projektowanie warstwy serwera
Konfiguracja filtrów (V)
• Wykrycie nieznanego użytkownika
<bean id="anonymousProcessingFilter"
class="org.acegisecurity.providers.anonymous.
AnonymousProcessingFilter">
<property name="key" value="changeThis" />
<property name="userAttribute"
value="anonymousUser,Role_ANONYMOUS" />
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
19
Projektowanie warstwy serwera
Konfiguracja filtrów (VI)
• Autentykacja użytkownika
<bean id="authenticationProcessingFilter”
class="org.springframework.security.ui.basicauth.
BasicProcessingFilter">
<property name="authenticationManager"
ref="authenticationManager" />
<property name="authenticationEntryPoint"
ref="formLoginAuthenticationEntryPoint" />
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
20
Projektowanie warstwy serwera
Konfiguracja filtrów (VII)
• Obsługa wyjątków
<bean id="exceptionTranslationFilter”
class="org.springframework.security.ui.
ExceptionTranslationFilter">
<property name="authenticationEntryPoint">
<ref bean="formLoginAuthenticationEntryPoint" />
</property>
<property name="accessDeniedHandler”
ref="accessDeniedHandler" />
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
21
Projektowanie warstwy serwera
Konfiguracja filtrów (VII)
<bean id="accessDeniedHandler”
class="org.springframework.security.ui.
AccessDeniedHandlerImpl">
<property name="errorPage" value="/accessDenied.html" />
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
22
Projektowanie warstwy serwera
Konfiguracja filtrów (VIII)
• Zabezpieczenie strony
<bean id="filterSecurityInterceptor”
class="org.acegisecurity.intercept.web.
FilterSecurityInterceptor">
<property name="authenticationManager">
<ref bean="authenticationManager" />
</property>
<property name="accessDecisionManager">
<ref bean="accessDecisionManager" />
</property> ...
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
23
Projektowanie warstwy serwera
Konfiguracja filtrów (IX)
<property name="objectDefinitionSource">
<value>
/ierror.html=Role_ANONYMOUS,Authenticated_User
/logowanie.html=Role_ANONYMOUS,Authenticated_User
/aplikacja/**=Authenticated_User
/security/**=Role_Admin
</value>
</property>
</bean>
UWAGA: w URL wyłącznie małe litery
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
24
Projektowanie warstwy serwera
25
AccessDecisionManager
<bean id="accessDecisionManager"
class="org.acegisecurity.vote.AffirmativeBased">
<property name="allowIfAllAbstainDecisions" value="false" />
<property name="decisionVoters">
<list>
<bean class="org.acegisecurity.vote.RoleVoter">
<property name="rolePrefix" value="” />
</bean>
</list>
</property>
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Projektowanie warstwy serwera
AuthenticationManager
<bean id="authenticationManager"
class="org.acegisecurity.providers.ProviderManager">
<property name="providers">
<list>
<ref bean="XMLAuthenticationProvider" />
</list>
</property>
<property name="sessionController”
ref="concurrentSessionController"/>
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
26
Projektowanie warstwy serwera
AuthenticationProvider
<bean id="XMLAuthenticationProvider”
class="org.acegisecurity.providers.dao.
DaoAuthenticationProvider">
<property name="userDetailsService">
<ref bean="XMLDetailsProvider" />
</property>
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
27
Projektowanie warstwy serwera
XMLDetailsProvider
<bean id="XMLDetailsProvider”
class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">
<property name="userMap">
<value>
admin = admin,admin
menu1 = menu1,menu1
menu2 = menu2,menu2
menu3 = menu3,menu3
</value>
</property>
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
28
Projektowanie warstwy serwera
AuthenticationProvider (DAO)
<bean id="DAOAuthenticationProvider"
class="org.springframework.security.providers.dao.
DaoAuthenticationProvider">
<property name="userDetailsService">
<ref bean="DAODetailsProvider" />
</property>
<property name="passwordEncoder"
ref="passwordEncoder" />
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
29
Projektowanie warstwy serwera
DAODetailsProvider (DAO) (I)
<bean id="DAODetailsProvider”
class="dao.security.authentication.MyAuthenticationDao">
<property name="sessionFactory"
ref="hibernateSessionFactory" />
<property name="authorities_HQL">
<value>
select distinct rola.nazwa from ACLRola rola inner join
inner join rola.uzytkownicy us where us.login = :login
</value>
</property>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
30
Projektowanie warstwy serwera
DAODetailsProvider (DAO) (II)
<property name="login_HQL">
<value>
from Uzytkownik u where u.login = :login
</value>
</property>
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
31
Projektowanie warstwy serwera
32
ExampleAuthenticationDao (I)
public class MyAuthenticationDao extends
HibernateDaoSupport implements UserDetailsService
{
private String
authorities_HQL;
private String
login_HQL;
@Override
public UserDetails loadUserByUsername(String userLogin)
throws UsernameNotFoundException,DataAccessException
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Projektowanie warstwy serwera
ExampleAuthenticationDao (II)
{
List<Uzytkownik> userlist = (List<Uzytkownik>)
getHibernateTemplate().findByNamedParam(login_HQL,
"login", userLogin);
Uzytkownik user = userlist.get(0);
GrantedAuthority[] arrayAuths = getAuthorities(user);
UserDetails authUser = new UserDetails(user.getLogin(),
user.getHaslo(), user.isCzyAktywne(), expired, true, true,
arrayAuths);
return authUser;
}}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
33
Projektowanie warstwy serwera
EntryPoint
<bean id="formLoginAuthenticationEntryPoint"
class="org.acegisecurity.ui.webapp.
AuthenticationProcessingFilterEntryPoint">
<property name="loginFormUrl">
<value>/logowanie.html</value>
</property>
<property name="forceHttps">
<value>false</value>
</property>
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
34
Projektowanie warstwy serwera
35
Konfiguracja filtrów (X)
• Definicja panelu logowania
<bean id="formAuthenticationProcessingFilter”
class="commons.servlet.filter.
MyAuthenticationProcessingFilter">
<property name="filterProcessesUrl" value="/_login" />
<property name="passwordParameter" value="_password"/>
<property name="usernameParameter" value="_username"/>
<property name="authenticationFailureUrl">
<value>/logowanie.html</value>
</property>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Projektowanie warstwy serwera
Konfiguracja filtrów (XI)
<property name="defaultTargetUrl">
<value>/logowanie.html</value>
</property>
<property name="authenticationManager">
<ref bean="authenticationManager" />
</property>
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
36
Projektowanie warstwy serwera
Login - jsp
<form action="<c:url value="/_login"/>" method="post">
Login: <input name="_username"/>
Hasło: <input name="_password" type="password”/>
<button type="submit">Zaloguj</button>
</form>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
37
Projektowanie warstwy serwera
LoginFilter
public class MyAuthenticationProcessingFilter extends
AuthenticationProcessingFilter
{
@Override
protected void onSuccessfulAuthentication(HttpServletRequest request,
HttpServletResponse response, Authentication authResult)
{
Object obj =
SecurityContextHolder.getContext().getAuthentication().getPrincipal();
//zapisanie danych w bazie lub do loggera
super.onSuccessfulAuthentication(request, response, authResult);
}
}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
38
Projektowanie warstwy serwera
39
Konfiguracja filtrów (XII)
• wylogowywania
<bean id="logoutFilter”
class="org.springframework.security.ui.logout.LogoutFilter">
<property name="filterProcessesUrl" value="/_logout”/>
<constructor-arg>
<list>
<bean class="commons.security.filter.MyLogoutFilter”/>
</list>
</constructor-arg>
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Projektowanie warstwy serwera
LogoutFilter
public class MyLogoutFilter implements LogoutHandler
{
@Override
public void logout(HttpServletRequest arg0,
HttpServletResponse arg1, Authentication arg2)
{
HttpSession session = arg0.getSession(false);
if (session != null) session.invalidate();
}
}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
40
Projektowanie warstwy serwera
Logout - jsp
<div class="logon">
<a href="<c:url value="/_logout"/>">wyloguj</a>
</div>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
41
Projektowanie warstwy serwera
passwordEncoder
protected String zaszyfrujHaslo(String plainPassword)
{
return passwordEncoder.encodePassword(plainPassword, null);
}
<bean id="passwordEncoder”
class="org.springframework.security.providers.encoding.
ShaPasswordEncoder">
<property name="encodeHashAsBase64" value="true">
</property>
<constructor-arg value="384"></constructor-arg>
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
42
Projektowanie warstwy serwera
ApplicationListener
public class AutentykacjaListener implements ApplicationListener
{
private DziennikService dziennikService;
@Override
public void onApplicationEvent(ApplicationEvent event)
{
if (event instanceof AuthenticationSuccessEvent)
{
AuthenticationSuccessEvent e = (AuthenticationSuccessEvent) event;
dziennikService.zarejstruj(e.getAuthentication(), e.getTimestamp());
}
}}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
43
Projektowanie warstwy serwera
ApplicationListener (konfiguracja)
<bean class="commons.security.authentication.event.
ApplicationListener">
<property name=”dziennikService"
ref=”dziennikService">
</property>
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
44