Kopiowanie zabronione - kliknij tutaj i uzyskaj dostęp do GitHuba!

Spring security – basic authentication


Basic authentication to sposób uwierzytelniania oparty o HTTP. Serwer wysyła do klienta żądanie podania nazwy użytkownika i hasła. Dane są następnie przesyłane do serwera w odpowiedzi w formie otwartego tekstu zakodowane jedynie algorytmem Base64 w nagłówku żądania. Bardzo ważne jest zatem zabezpieczenie tego procesu np. poprzez bezpieczne połączenie SSL.

Utwórzmy nowy projekt Spring Boota – niezbędne zależności – plik pom.xml:

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-security</artifactId>
	</dependency>

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>

	<dependency>
		<groupId>org.json</groupId>
		<artifactId>json</artifactId>
		<version>20180813</version>
	</dependency>
</dependencies>

Klasa konfiguracyjna – Spring Security gdzie określamy, że każde żądanie musi być zweryfikowane czy użytkownik ma odpowiednie prawa dostępu do danego zasobu:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests().anyRequest().authenticated()
                .and()
                .httpBasic();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
            throws Exception
    {
        auth.inMemoryAuthentication()
                .withUser("admin")
                .password("nimda")
                .roles("USER");
    }
}

RestController – zwracamy obiekt typu String w postaci JSONa:

@RestController
@RequestMapping(path = "/data")
public class RestApiController {

    @GetMapping(path="/json", produces = "application/json")
    public String getJsonData() {

        String jsonString = new JSONObject()
                .put("json", "json value").toString();

        return jsonString;
    }
}

Pod adresem:

http://localhost:8080/

wyskoczy komunikat z prośbą o podanie loginu i hasła:

dane niezbędne do zalogowania to:

login: admin

hasło admin

po wpisaniu powyższych danych w logach Spring Boota otrzymamy taki oto błąd:

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"

Spowodowane jest to tym, że Spring wymaga szyfrowania haseł w formie DelegatingPasswordEncoder, wcześniej czyli przed Springiem 5 była to forma NoOpPasswordEncoder. Rozwiązaniem powyższego błędu jest uzupełnienie metody configureGlobal w następujący oto sposób:

 @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
            throws Exception
    {
        auth.inMemoryAuthentication()
                .withUser("admin")
                .password("{noop}nimda")
                .roles("USER");
    }

Pod adresem:

http://localhost:8080/data/json

po zalogowaniu się wynik jest następujący:

json : "json value"

Używając klienta REST np. Advanced Rest Client, nagłówek authorization który dodawany jest do żądania po poprawnym podaniu danych niezbędnych do uwierzytelnienia zawiera wartość która jest zakodowaną kombinacją loginu i hasła:

Kod źródłowy do wglądu na GitHub!

Jeśli chcesz uzyskać dostęp do GitHuba na 30 dni i pobrać kod źródłowy wyślij smsa o treśći DOSTEP.EDUSESSION na numer 7943. Tyle wiedzy a koszt to tylko 9 PLN (11.07 PLN z VAT).





Leave a comment

Your email address will not be published.


*