2012-05-23 16 views
5

Próbuję poradzić sobie z sytuacją, gdy po udanym uwierzytelnieniu z dostawcą openId odkryłem, że nie ma konta w mojej db związanej z identyfikatorem openId użytkownika.Wsparcie OpenId w zakresie bezpieczeństwa wiosennego i deauthentication użytkownika

Czy możesz mi powiedzieć, jak mam sobie z tym poradzić. Teraz wyświetlam formularz rejestracyjny i pytam użytkownika o utworzenie konta. Mam jednak problem ze statusem uwierzytelniania użytkownika, który jest teraz postrzegany jako uwierzytelniony przez klasę Spring SecurityContext.

Jak odautoryzować użytkownika w mojej akcji kontrolera przed przekierowaniem na stronę "zarejestruj nowego użytkownika"? Czy to podejście jest dobre, czy też powinienem to zrobić w jakiś inny sposób?

Odpowiedz

2

Ok, więc oddzielenie uwierzytelniania od autoryzacji, jak wspomniano w poście Samuela, było naprawdę pomocne. Jednak nadal istnieje wiele błędów i uważam, że deautentyfikacja jest koniecznością, ponieważ na wiosnę nie ma łatwego sposobu dodawania nowych ról. Najłatwiej jest więc zmusić użytkownika do ponownego zalogowania się i pozwolić wiosłującemu na przypisanie roli podczas logowania.

W celu deauthenticate użytkownik w wiosennej bezpieczeństwa trzeba powołać:

SecurityContextHolder.clearContext(); 

jako alternatywę można rzucić wyjątek w implementacji UserDetailsService (patrz niżej). Ma wadę, że można deauthenticate użytkownika i stracić dane kontekstu użytkownika, więc byłoby niemożliwe, aby dopasować nowy użytkownik accout z kontem openid podczas tworzenia nowego konta lokalnego. I musisz połączyć te konta po zalogowaniu użytkownika z tradycyjną nazwą użytkownika i hasłem. Moim rozwiązaniem było deauthenticate użytkownika tuż po utworzeniu nowego konta.

W celu przyznania ról użytkowników (przywileje) trzeba zastąpić UserDetailsService w przypadku kogoś znaleźć to przydatny tutaj jest moje wykonanie:

public final class MyUserDetailsService implements UserDetailsService { 
    private final UsersDao usersDao; 

    @Autowired 
    public UserDetailsServiceImpl(final UsersDao usersDao) { 
     this.usersDao = usersDao; 
    } 

    @Override 
    public UserDetails loadUserByUsername(final String username) {  
      UserEntity user = usersDao.getUserByOpenIdIdentifier(username); 
      if (user == null) { 
        // there is no such user in our db, we could here throw 
        // an Exception instead then the user would also be deuthenticated 
        return new User(username, "", new ArrayList<GrantedAuthority>()); 
      } 

      //here we are granting to users roles based on values from db 
      final Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
      authorities.add(new SimpleGrantedAuthority(user.getUserType().toString())); 

      final UserDetails result = new User(username, "", authorities); 

      return result; 
    } 
} 
1

Myślę, że możesz mieszać dwie koncepcje: uwierzytelnianie i autoryzacja. Uwierzytelnienie polega na ustaleniu, kim jest użytkownik, autoryzacja to prawo do korzystania z dostępu do zasobu funkcji.

W bezpieczeństwa sprężyny, to dwa pojęcia są wdrażane przez uwierzytelniania kierownika i access-decyzji kierownika.

Fakt, że użytkownik nie istnieje w bazie danych, nie jest powodem do odmowy jego tożsamości: nie cofnięcia autoryzacji! Ale uwierzytelnianie może być kryterium w zarządzaniu decyzjami dostępu. Przykład: AuthenticatedVoter.

Nie należy dotykać w uwierzytelniania, ale dostosować access-decyzji-manager stosować następujące zasady:

  • Użytkownik, który nie istnieje w bazie danych ma dostęp do wszystkiego z wyjątkiem funkcji tworzenia konta
  • Użytkownik, który nie istnieje w bazie danych, ma dostęp tylko do funkcji tworzenia konta.

To wszystko dotyczy zarządzania dostępem, a nie uwierzytelniania.

Czytaj więcej na http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#ns-access-manager

PS: Dokumentacja ta nie jest wyczerpująca w wiosennej bezpieczeństwa, ale kod źródłowy jest bardzo czytelny. Moją radą jest sprawdzić to i sprawdzić implementację elementów, które potrzebujesz dostosować.