Spring security – basic authentication

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(httpecurity 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/data/json

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:

Zobacz kod na GitHubie i zapisz się na bezpłatny newsletter!

.

Zobacz też film na YouTube!

Leave a comment

Your email address will not be published.


*