Spring Security - Persistent Souviens-toi de moi

Spring Security - Persistent Souviens-toi de moi

1. Vue d'ensemble

Cet article montrera comment configurer lesRemember Me functionality in Spring Security - en utilisant non pas l'approche standard des cookies, mais lesa more secure solution, using persistence.

Comme introduction rapide, Spring peut être configuré pour mémoriser les informations de connexion entre les sessions du navigateur. Cela vous permet de vous connecter à un site Web et de le faire automatiquement vous reconnecter lors de votre prochaine visite sur le site (même si vous avez fermé le navigateur entre-temps).

2. Deux solutions «Souvenez-vous de moi»

Spring propose deux implémentations légèrement différentes pour résoudre le problème. Les deux utilisent lesUsernamePasswordAuthenticationFilter, en utilisant des hooks pour appeler une implémentation deRememberMeServices.

Nous avons déjà couvert la solution standard Remember Me, en utilisant uniquement un cookie, ena previous article. Cette solution utilisait un cookie appeléremember-me - contenant le nom d'utilisateur, l'heure d'expiration et le hachage MD5 contenant le mot de passe. Comme il contient un hachage du mot de passe,this solution is potentially vulnerable si le cookie est capturé.

Dans cet esprit - jetons un œil à la deuxième approche - en utilisantPersistentTokenBasedRememberMeServices pour stocker les informations de connexion persistantes dans une table de base de données entre les sessions.

3. Prérequis - Créer la table de base de données

Premièrement - nous avons besoin des informations de connexion dans la base de données - nous avons besoin d’une table pour créer les données:

create table if not exists persistent_logins (
  username varchar_ignorecase(100) not null,
  series varchar(64) primary key,
  token varchar(64) not null,
  last_used timestamp not null
);

Il s'agit decreated automatically on startup via la configuration XML suivante (en utilisant un H2 db en mémoire):



    

Et dans un souci de complétude, voici comment la persistance est mise en place:

@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-h2.properties" })
public class DatabaseConfig {

    @Autowired private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
        dataSource.setUrl(env.getProperty("jdbc.url"));
        dataSource.setUsername(env.getProperty("jdbc.user"));
        dataSource.setPassword(env.getProperty("jdbc.pass"));
        return dataSource;
    }
}

[.iframe-fluid] ##

4. La configuration de sécurité Spring

La première configuration clé est la configuration HTTP Remember-Me (notez la propriétédataSource):


    ...
    

Ensuite, nous devons configurer lesRememberMeService réels et lesJdbcTokenRepository (qui utilisent également lesdataSource):



    
    
    




    
    




    
    

Comme nous l'avons mentionné, leTokenBasedRememberMeServices standard stockait le mot de passe utilisateur haché dans le cookie.

Cette solution - lePersistentTokenBasedRememberMeServices utilise ununique series identifier for the user. Ceci identifie la connexion initiale de l'utilisateur et reste constante à chaque fois que l'utilisateur se connecte automatiquement au cours de cette session persistante. Il contient également desa random token qui sont régénérés chaque fois qu'un utilisateur se connecte via les fonctions de rappel de moi persistantes.

Cette combinaison de séries et de jetons générés aléatoirement est persistante, rendant très improbable une attaque par force brute.

6. En pratique

Pour voir le mécanisme Remember Me fonctionner dans un navigateur, vous pouvez:

  1. Se connecter avec Remember Me active

  2. Fermer le navigateur

  3. Rouvrez le navigateur et revenez à la même page. Rafraîchir.

  4. Vous serez toujours connecté

Without Remember Me active, après l'expiration du cookie, l'utilisateur doit être redirigé vers la page de connexion. With remember me, l'utilisateur reste désormais connecté à l'aide du nouveau jeton / cookie.

Vous pouvez également afficher les cookies dans le navigateur et les données persistantes dans la base de données (remarque - vous souhaiterez peut-être basculer de l'implémentation H2 intégrée pour cela).

7. Conclusion

Ce tutoriel a illustré commentset up and configure a database persisted Remember Me Token functionality. C'est également un suivi de l'article précédent qui traitait desstandard Cookie Token based functionality. L'approche de la base de données est plus sécurisée car les détails du mot de passe ne sont pas conservés dans le cookie - mais cela implique un peu plus de configuration.

L'implémentation de ce tutoriel Spring Security REST se trouve dansthe github project - il s'agit d'un projet basé sur Eclipse, il devrait donc être facile à importer et à exécuter tel quel.