niedziela, 9 kwietnia 2017

Zabezpieczanie aplikacji ze Spring Security

Ostatnio przez różne zawirowania dość mocno zaniedbałam projekt, ale wreszcie znalazłam trochę czasu, by wrócić. Nie poddam się przecież po zaledwie miesiącu blogowania! :)
Dziś na tapecie: zabezpieczanie aplikacji. Umożliwienie logowania, uniemożliwienie wejścia na konkretne strony niezalogowanym użytkownikom. Do tego celu posłuży mi Spring Security.

Spring Security to framework umożliwiający w łatwy sposób dodanie do aplikacji funkcji autoryzowania użytkowników. Właściwie niemal cała konfiguracja odbywa się za pomocą plików XML. Pierwszym krokiem jest dodanie biblioteki do projektu - ponieważ używam Mavena, wystarczy dodać kilka linii do pliku pom.xml i przebudować projekt:

<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
<dependency>
 <groupId>org.springframework.security</groupId>
 <artifactId>spring-security-web</artifactId>
 <version>4.2.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
<dependency>
 <groupId>org.springframework.security</groupId>
 <artifactId>spring-security-config</artifactId>
 <version>4.2.2.RELEASE</version>
</dependency>

Następnie dodajemy plik spring-security.xml, w którym znajdują się ustawienia zabezpieczeń:

<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-4.2.xsd">

    <http auto-config="true">
        <intercept-url pattern="/" access="permitAll" />
        <intercept-url pattern="/index.jsp" access="permitAll" />
        <intercept-url pattern="/register" access="permitAll" />
        <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
    </http>

    <authentication-manager>
      <authentication-provider>
        <user-service>
        <user name="ania" password="1qaz" authorities="ROLE_USER" />
        </user-service>
      </authentication-provider>
    </authentication-manager>

</beans:beans>

Taka konfiguracja zezwala wszystkim użytkownikom (zalogowanym i niezalogowanym) na wejście na strony: główną ("/"), index.jsp i /register. Pozostałe strony są dostępne tylko po zalogowaniu się.
Logowanie z kolei obecnie jest możliwe tylko dla użytkownika ania, za pomocą hasła 1qaz. Oczywiście jest to rozwiązanie tymczasowe - docelowo użytkownicy będą przechowywani w bazie, nie w pliku. :)
Aby plik spring-security.xml był "widziany" przez aplikację, konieczne jest dopisanie kilku linii w pliku web.xml:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

    <!-- Loads Spring Security config file -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring-security.xml
    </param-value>
</context-param>

<!-- Spring Security -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy
    </filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Żeby to wszystko zadziałało, trzeba jeszcze włączyć obsługę sesji na stronach, które mają być dostępne tylko po zalogowaniu, poprzez dopisanie na początku pliku linii:

<%@page session="true"%>

Tak wyposażeni i skonfigurowani możemy teraz podbijać świat.
Kolejne kroki, które mnie czekają:
  • zmiana domyślnej formatki logowania (wygenerowanej przez Spring Security) na własną (którą chwaliłam się o tu),
  • dodanie bazy danych i przechowywanie w niej danych użytkowników.
Stay tuned!

-------
Źródła, z których korzystałam:
Lekcje o Spring Security na KobietyDoKodu: 1, 2, 3
Tutorial na mkyong.com
Kilka słów z dokumentacji Spring Security na temat definiowania dostępu do zasobów

Brak komentarzy:

Prześlij komentarz