Spring Security Token Authentication-RESTful JSON Service

Chcę użyć Spring Security dla aplikacji Spring MVC, która będzie ściśle usługą internetową JSON. Zrobiłem trochę badań i przeczytałem kilka artykułów, ale tak naprawdę nie znalazłem niczego kompletnego. Chcę, aby aplikacja była całkowicie bezpaństwowa i używała uwierzytelniania opartego na tokenie. Nie chcę, aby aplikacja Spring MVC miała jakieś formularze lub używane formularze do uwierzytelniania. Powinien ściśle pobierać żądania i dane w JSON i zwracać odpowiedzi JSON.

Będzie kątowy Aplikacja kliencka JS, która będzie musiała wysłać nazwę użytkownika i hasło oraz pobrać token z aplikacji do wykorzystania w żądaniach sekwencyjnych. W pewnym momencie mogą istnieć klienci Androida, którzy również uzyskują dostęp do tej usługi internetowej.

Zakładam, że Spring Security ma swoją drogę wewnętrznie do mapowania tokena do sesji użytkownika, co oznacza, że wie, że token XXXXXXXXXX to admin user Bob, a token aaaaaaaaa to standardowy użytkownik Joe. Jednak nie mam duzego doswiadczenia Z Spring Security wiec Nie wiem jak to wszystko się składa. Nadal chcę móc korzystać z zabezpieczonych adnotacji na kontrolerach i metodach usług.

Czy Jest jakiś sposób, aby to osiągnąć w wiosennej ochronie?

To pytanie wydaje się być dobrym miejscem do rozpoczęcia, ale nie jestem pewien, czy to zadziała, jak to sobie wyobrażałem RESTful Authentication via Spring .

Author: Community, 2014-06-11

3 answers

To będzie dobre miejsce na początek Spring-Rest-Boilerplate .

  1. po raz pierwszy musisz użyć HTTP basic authentication i następnie zaloguj się (wyślij nazwę użytkownika/hasło), a to zwróci token.
  2. w kolejnym żądaniu użyjesz tego tokena do uwierzytelnienia.
  3. będziesz musiał dodać filtr do łańcucha, który to zrobi uwierzytelnianie oparte na tokenie.

Musisz wymyślić format tokenu i szyfrowanie dla tego samego. Ty idealnie należy zachować wygaśnięcie tokenu, wygaśnięcie wraz z nazwą użytkownika może być częścią tokenu.Użyj algorytmu szyfrowania kryptograficznej funkcji skrótu, takiej jak MD5 i uzyskaj hash całego tokenu.

Edit : Jak zauważył Maciej Stępyra MD5 wydaje się być zepsuty i zaleca używanie silniejszych funkcji hashowych, takich jak SHA-256.

Spring security domyślnie przekieruje Cię na stronę logowania, ale nie ma to sensu w przypadku odpoczynku więc Użyj niestandardowego AuthenticationEntryPoint w config(ref przykładowy kod github).

Używałem tego formatu jako Tokena: token:username:hash:expiry

Hash = MD5 (username+magickey)

Expiry=current_timestamp+mins_to_expiry

 <security:http realm="Protected API" use-expressions="true" auto-config="false" create-session="always" entry-point-ref="**CustomAuthenticationEntryPoint**">
        <security:custom-filter ref="**authenticationTokenProcessingFilter**" position="PRE_AUTH_FILTER" />
        <security:intercept-url pattern="/**" access="isAuthenticated()" />
 </security:http>

NB: dzięki dhavaln za Kod. Użyłem tego jako odniesienia i rozwinąłem podobną rzecz.

 18
Author: M4ver1k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-22 11:17:21

"chcę, aby aplikacja była całkowicie bezpaństwowa"

Zastanowię się nad tym, co próbujesz zrobić. Istnieje powód, dla którego nie możesz znaleźć dobrych przykładów swojego rozwiązania: po prostu nie możesz mieć aplikacji, która jest zarówno bezpaństwowa, jak i bezpieczna. Również jeśli przechowujesz gdzieś żetony, nie jesteś bezpaństwowcem. Nawet jeśli nie przechowujesz tokenów (jak używanie JWT do ich kodowania), musisz chronić się przed atakami CSRF, jeśli użytkownicy będą mieli dostęp do tego w przeglądarce internetowej. Jeśli idź swoją trasę, spodziewaj się, że napiszesz dużo dostosowanego kodu bezpieczeństwa (co jest złą rzeczą). Zobacz dyskusję na ten temat tutaj: https://spring.io/blog/2015/01/12/the-login-page-angular-js-and-spring-security-part-ii
 1
Author: user64141,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-14 20:38:29

W moim przypadku łatwiej było zastąpić org.springframework.security.web.context.SecurityContextRepository in org.springframework.security.web.context.SecurityContextPersistenceFilter implementacją, która dzieli SecurityContext między kilka węzłów tomcat. Klient wysyła token podobny do jsessionid, ale mogę wykonać proste round-robin load balancing i nie muszę się martwić o replikację sesji.

 1
Author: user2560528,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-11 14:48:43