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:
Leave a comment