Używamy poświadczenia zasobów właściciela przyznania homologacji typu (z oauth2:password
w security-config.xml
Zagrajmy się ten scenariusz, aby wyjaśnić mój kłopot.Używając Spring Security OAuth2, jaki jest właściwy sposób na odświeżenie zapisanego uwierzytelnienia w TokenStore?
- Bob został stworzony z organami
ROLE_USER
- Bob próbuje uzyskać dostęp do OAuth2 chronionej zasób
- Bob korzysta z oficjalną aplikację mobilną do niego dostęp, więc poświadczenia klienta są poprawne
- token dostępu Boba jest tworzony i przechowywany w
TokenStore
, włączył na jegousername
,client_id
iscope
. (patrz DefaultAuthenticationKeyGenerator.java) - Telefon Boba próbuje wywołać chronione usługi tym tokenem dostępu, ale te usługi wymagają od użytkowników posiadania
authority
zROLE_MOBILE_USER
. - Bob kontaktuje się z właścicielem bazy danych i dodaje do swojego użytkownika
ROLE_MOBLE_USER
w bazie danych. - Bob próbuje uzyskać kolejny token dostępu, ale
DefaultTokenServices
zwraca mu ten sam, niepracujący token dostępu. - Jedynym sposobem na wykorzystanie jego nowego
authority
jest poczekać, aż wygasa jego stary token dostępu, aby mógł uzyskać nowy token dostępu z poprawnąauthority
.
Istnieje wiele sposobów rozwiązania tego problemu.
Po pierwsze aplikacja administracyjna, która dodaje ROLE_MOBILE_USER
do władz Boba, może następnie usunąć wszystkie tokeny dostępu i autoryzacje w bazie danych. W ten sposób DefaultTokenServices
po prostu utworzy nowy z odpowiednimi uprawnieniami uszeregowanymi jako jego nowa autoryzacja OAuth2. Jednak możemy nie chcieć, aby administracyjna aplikacja webowa zajmowała się OAuth w tym momencie (przynajmniej jeszcze nie). Jeśli to możliwe, chcielibyśmy, aby obawy administracyjne były jak najbardziej zwięzłe, a na razie nie ma zależności na oauth.
mogliśmy narazić metodę do punktu końcowego /oauth/access_token
DELETE
i powiedz aplikację mobilną i spróbuj usunąć ten żeton dostępu i ponowne zainteresowanie jeden, tylko w przypadku, gdy są przechowywane authorities
zestarzeć. Czuje się bardziej jak praca na okrągło.
Wreszcie mogę serializować authorities
w mojej własnej zdefiniowanej AuthenticationKeyGenerator
. Zasadniczo użyłby autoryzacji i wykonałby na nich ten sam algorytm skrótu. W ten sposób, gdy Bob spróbuje się zalogować, dostanie ten sam token dostępu, ale bazowy magazyn tokenowy rozpozna, że ma inne uwierzytelnienie (od menedżera uwierzytelniania w komponencie bean tokena) i odświeża swoją bazę danych. Problem z tym rozwiązaniem polega na tym, że polega on tylko na zachowaniu implementacyjnym bazowego magazynu tokenów (chociaż zachowują się one zarówno w ten sposób), jak InMemoryTokenStore
i JdbcTokenStore
.
Czy możesz wymyślić jakieś lepsze/czystsze rozwiązania? Czy to nadmiar myślenia?
Z góry dziękuję.
dodam, że w tym momencie użył niestandardowego 'AuthenticationKeyGenerator' i rzeczy działały poprawnie. Nadal chciałbym mieć lepsze/czystsze rozwiązanie, ponieważ klucz jest sprawdzany tylko wtedy, gdy serwer autoryzacji jest proszony o nowy token, ale serwer zasobów wciąż może używać starych uprawnień. – Joe
Czy wciąż trzymasz się tego rozwiązania, czy też znalazłeś lepszy sposób rozwiązania tego problemu? Mam dokładnie ten sam problem i nie jestem pewien, jak sobie z tym poradzić. – rpvilao
Utknęliśmy przy tym rozwiązaniu i nie napotkaliśmy na razie żadnych problemów. Polecam jednak pierwsze rozwiązanie i przyjmuję, że zmiana autoryzacji użytkownika wymaga dotknięcia bazy danych tokenu. – Joe