HTTP Basic Authentication to podstawowy i chyba najprostszy sposób zabezpieczenia aplikacji przed światem zewnętrznym. W tym poście zapiałem kilka niezbędnych notatek dotyczących HTTP Basic Auth w Springu. Mogą się one wydawać porozrzucane, ale zapisuje je tak, jak uczę się ich sam i buduję swój system zabezpieczeń z użyciem Spring Security HTTP Basic Authentication. Wskakuj jeżeli chcesz i zobacz jakie materiały przygotowałem sobie na temat zabezpieczeń w Springu i samego HTTP Basic Authentication i Authorization.
Na wstępię chciałbym dodać, iż nie jest to wyczerpujący artykuł na temat Spring Security czy HTTP Basic Authentication w Springu. Jest to raczej podsumowanie aka pewnego rodzaju cookbook w tej materii. Sam, w wieku 41 zaczynam się uczyć Springa i przelewanie tego czego się nauczyłem na ‘papier’ (choćby taki elektroniczny jak tutaj), pozwala mi lepiej zapamiętać i utrwalić zdobyte wiadomości.
Jak Działa Uwierzytelnianie w Spring Security
Krótki opis flow w Spring Security
Jest wiele poziomów na jakich można ‘wkroczyć’ w implementację spring security. Można to zrobić praktycznie w każdym z wyżej widocznych elementów, który jest niezależną klasa lub interfejsem. Można użyć standardowej uwierzytelniania lub wpłynąć na jego flow.
Interfejs UserDetailsService zajmuje się jedynie ‘wydobywaniem’ użytkownika po jego ‘username’.
Za to interfejs UserDetailsManager rozbudowuje tą funkcjonalność poprzez dodanie metod takich jak
- createUser (UserDetails userDetails) : void
- updateUser (UserDetails userDetails) : void
- deleteUser (String username): void
- changePassword (String v1, String v2): void
- userExists (String username) : boolean
Jak zaimplementować HTTP Basic Authentication w Spring Security
Aby zacząć manipulować Spring Security najlepiej zacząć od modyfikacji czy własnej implementacji Beanów realizujących interfejsy UserDetailsService oraz PasswordEncoder .
Te 2 beany to tak jakby ‘mięcho i ziemniaczki’ w pierwszym daniu jakie skonsumujesz pracując ze Spring Security.
Własna Implementacja UserDetailsService i PasswordEncoder
Aby je zaimplementować, najprościej jest stworzyć klasę konfiguracyjną i dodać w niej 2 metody tworzące beany zwracające obiekty realizujące te dwa interfejsy.
@Configuration public class UserManagementConfig { @Bean public UserDetailsService userDetailsService() { /* UserDetailsService is resp. ONLY for retrieving user by username */ /* UserDetailsManager extends it by modif., del., pass.change, update etc */ UserDetailsManager userDetailService = new InMemoryUserDetailsManager(); /* Describing the user */ UserDetails user = User.withUsername("john") .password("123456") .authorities("read") .disabled(false) .build(); userDetailService.createUser(user); return userDetailService; } @Bean public PasswordEncoder passwordEncoder() { return NoOpPasswordEncoder.getInstance(); } }
Można już sprawdzić jak działa aplikacja poprzez próbę wywołania w przeglądarce adresu endpointu któregoś z kontrolerów. Można także użyć POSTMANA czy curl’a .
$ curl --user john:123456 http://localhost:8080/endpoint_tutaj -i
0 Komentarzy