440 likes | 686 Views
Acegi. Acegi. Acegi jest to narzędzie służące zapewnieniu bezpieczeństwa w aplikacjach korporacyjnych. Zapewnia wszechstronne mechanizmy uwierzytelniania i autoryzacji.
E N D
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
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
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
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
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
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
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
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
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
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
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
FilterChainProxy <bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"> <property name="filterInvocationDefinitionSource"> <value> /**=httpSessionContextIntegrationFilter,securityContextHolderAwareRequestFilter,anonymousProcessingFilter,formAuthenticationProcessingFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor,logoutFilter /security/**= httpSessionContextIntegrationFilter, .... </value> </property> </bean> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Kolejność filtrów • 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
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
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
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
Konfiguracja filtrów (IV) <bean id="securityContextHolderAwareRequestFilter" class="org.acegisecurity.wrapper. SecurityContextHolderAwareRequestFilter" /> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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