Spring Security Exemple XML Hibernate

Exemple avec Spring Security + Hibernate XML

spring-hibernate-logo

Dans ce tutoriel, nous allons vous montrer comment intégrer Hibernate 4 dans Spring Security, exemple de configuration XML.

Note
Pour la version d'annotation, veuillez lire ceSpring Security + Hibernate Annotation Example.

Technologies utilisées:

  1. Spring 3.2.8.RELEASE

  2. Spring Security 3.2.3.RELEASE

  3. Hibernate 4.2.11.Final

  4. MySQL Server 5.6

  5. JDK 1.6

  6. Maven 3

  7. Eclipse 4.3

Notes rapides

  1. Créer une fabrique de session avechibernate4.LocalSessionFactoryBean

  2. Injecter la fabrique de sessions dans un UserDao

  3. Pour intégrer Spring Security, créez une classe qui implémente l'interfaceUserDetailsService et charge l'utilisateur avec UserDao

  4. Le gestionnaire de transactions doit être déclaré, sinon Hibernate ne fonctionnera pas au printemps

1. Répertoire des projets

Une structure de répertoire de projet final.

spring-security-hibernate-directory

2. Dépendance du projet

Liste des dépendances du projet dans le fichier POM.

pom.xml

    
        3.2.8.RELEASE
        3.2.3.RELEASE
        1.2
        5.1.30
        1.1.2
        1.7.6
        4.2.11.Final
        1.4
        2.5
    

    

        
        
            commons-dbcp
            commons-dbcp
            ${dbcp.version}
        

        
        
            org.hibernate
            hibernate-core
            ${hibernate.version}
        

        
        
            org.springframework
            spring-core
            ${spring.version}
            
              
                commons-logging
                commons-logging
              
            
        

        
        
            org.springframework
            spring-webmvc
            ${spring.version}
        

        
        
            org.springframework
            spring-aspects
            ${spring.version}
        

        
        
            org.springframework
            spring-orm
            ${spring.version}
        

        
        
            org.springframework.security
            spring-security-web
            ${spring.security.version}
        

        
            org.springframework.security
            spring-security-config
            ${spring.security.version}
        

        
        
            org.springframework.security
            spring-security-taglibs
            ${spring.security.version}
        

        
        
            jstl
            jstl
            ${jstl.version}
        

        
        
            mysql
            mysql-connector-java
            ${mysql.connector.version}
        

        
        
            org.slf4j
            slf4j-api
            ${slf4j.version}
        

        
            org.slf4j
            jcl-over-slf4j
            ${slf4j.version}
        

        
            ch.qos.logback
            logback-classic
            ${logback.version}
        

        
            javax.servlet
            servlet-api
            ${servletapi.version}
            provided
        

    

3. Tables d'utilisateurs

Script SQL pour créer des tables pour stocker l'utilisateur et le rôle de l'utilisateur.

mysql.sql

CREATE  TABLE users (
  username VARCHAR(45) NOT NULL ,
  password VARCHAR(60) NOT NULL ,
  enabled TINYINT NOT NULL DEFAULT 1 ,
  PRIMARY KEY (username));

CREATE TABLE user_roles (
  user_role_id int(11) NOT NULL AUTO_INCREMENT,
  username varchar(45) NOT NULL,
  role varchar(45) NOT NULL,
  PRIMARY KEY (user_role_id),
  UNIQUE KEY uni_username_role (role,username),
  KEY fk_username_idx (username),
  CONSTRAINT fk_username FOREIGN KEY (username) REFERENCES users (username));

INSERT INTO users(username,password,enabled)
VALUES ('example','$2a$10$04TVADrR6/SPLBjsK0N30.Jf5fNjBugSACeGv1S69dZALR7lSov0y', true);
INSERT INTO users(username,password,enabled)
VALUES ('alex','$2a$10$04TVADrR6/SPLBjsK0N30.Jf5fNjBugSACeGv1S69dZALR7lSov0y', true);

INSERT INTO user_roles (username, role)
VALUES ('example', 'ROLE_USER');
INSERT INTO user_roles (username, role)
VALUES ('example', 'ROLE_ADMIN');
INSERT INTO user_roles (username, role)
VALUES ('alex', 'ROLE_USER');

4. Modèle utilisateur + mappage XML Hibernate

Classes de modèle et son fichier de mappage XML.

User.java

package com.example.users.model;

import java.util.HashSet;
import java.util.Set;

public class User {

    private String username;
    private String password;
    private boolean enabled;
    private Set userRole = new HashSet(0);

    //getter and setter methods
}

UserRole.java

package com.example.users.model;

public class UserRole{

    private Integer userRoleId;
    private User user;
    private String role;

    //getter and setter methods
}

Users.hbm.xml



    
        
            
            
        
        
            
        
        
            
        
        
            
                
            
            
        
    

UserRoles.hbm.xml



    
        
            
            
        
        
            
        
        
            
        
    

5. Classe DAO

Créez une classeUserDao pour charger les utilisateurs depuis la base de données, via Hibernate.

UserDao.java

package com.example.users.dao;

import com.example.users.model.User;

public interface UserDao {

    User findByUserName(String username);

}

UserDaoImpl.java

package com.example.users.dao;

import java.util.ArrayList;
import java.util.List;
import org.hibernate.SessionFactory;

import com.example.users.model.User;

public class UserDaoImpl implements UserDao {

    private SessionFactory sessionFactory;

    @SuppressWarnings("unchecked")
    public User findByUserName(String username) {

        List users = new ArrayList();

        users = getSessionFactory().getCurrentSession()
            .createQuery("from User where username=?")
            .setParameter(0, username).list();

        if (users.size() > 0) {
            return users.get(0);
        } else {
            return null;
        }

    }

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

}

6. UserDetailsService

Créez unUserDetailsService personnalisé, chargez l'utilisateur à partir deUserDao, puis créez les droits de l'utilisateur.

Note
L'exemple est une référence de ce printempsJdbcDaoImpl

MyUserDetailsService.java

package com.example.users.service;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

import com.example.users.dao.UserDao;
import com.example.users.model.UserRole;

public class MyUserDetailsService implements UserDetailsService {

    private UserDao userDao;

    @Override
    public UserDetails loadUserByUsername(final String username)
               throws UsernameNotFoundException {

        com.example.users.model.User user = userDao.findByUserName(username);
        List authorities = buildUserAuthority(user.getUserRole());

        return buildUserForAuthentication(user, authorities);


    }

    // Converts com.example.users.model.User user to
    // org.springframework.security.core.userdetails.User
    private User buildUserForAuthentication(com.example.users.model.User user,
        List authorities) {
        return new User(user.getUsername(),
            user.getPassword(), user.isEnabled(),
                        true, true, true, authorities);
    }

    private List buildUserAuthority(Set userRoles) {

        Set setAuths = new HashSet();

        // Build user's authorities
        for (UserRole userRole : userRoles) {
            setAuths.add(new SimpleGrantedAuthority(userRole.getRole()));
        }

        List Result = new ArrayList(setAuths);

        return Result;
    }

    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

}

7. XML de sécurité Spring

Lisez les commentaires, cela devrait être explicite.

spring-security.xml



    
    
        

        
        
        
        
        
        
    

    
        
            
        
    

spring-database.xml



    
    

        
        
        
        
    

    
    
        
        
            
                orm/Users.hbm.xml
                orm/UserRoles.hbm.xml
            
        
        
            
            
                           org.hibernate.dialect.MySQL5Dialect
                        
            true
            true
            
        
    

    
        
    

    
        
    

    
    
        
    

    
        
        
        
        
        
    

    
        
        
    

Terminé.

Note
Ces fichiers JSP, web.xml et contrôleur sont omis, c'est un code assez standard, si cela vous intéresse, veuillez télécharger le code source complet à la fin de l'article.

8. Démo du projet

La démo vidéo suivante est pour le didacticielSpring Security database login with JDBC. Étant donné que ce didacticiel génère la même sortie, mais utilise la mise en veille prolongée pour charger les utilisateurs, la démonstration vidéo est donc réutilisée.

8.1 Access a password protected page : http://localhost:8080/spring-security-hibernate/admin , a login page is displayed.

spring-security-hibernate1

8.2 Enter user “example” and password “123456”.

spring-security-hibernate2

8.3 Try access /admin page with user “alex” and password “123456”, a 403 page will be displayed.

spring-security-hibernate3

Télécharger le code source

Téléchargez-le -spring-security-hibernate.zip (30 Ko)