Пример Spring Security + Hibernate XML

Пример Spring Security + Hibernate XML

spring-hibernate-logo

В этом руководстве мы покажем вам, как интегрировать Hibernate 4 в Spring Security, пример конфигурации XML.

Note
Для версии аннотации, пожалуйста, прочтите этотSpring Security + Hibernate Annotation Example.

Используемые технологии:

  1. Весна 3.2.8. ВЫПУСК

  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. Затмение 4.3

Быстрые заметки

  1. Создайте фабрику сеансов сhibernate4.LocalSessionFactoryBean

  2. Вставить фабрику сеанса в UserDao

  3. Для интеграции со Spring Security создайте класс, реализующий интерфейсUserDetailsService, и загружает пользователя с UserDao

  4. Менеджер транзакций должен быть объявлен, иначе Hibernate не будет работать весной

1. Каталог проектов

Конечная структура каталогов проекта.

spring-security-hibernate-directory

2. Зависимость проекта

Список зависимостей проекта в файле 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. Таблицы пользователей

SQL-скрипт для создания таблиц для хранения пользователя и роли пользователя.

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. Модель пользователя + отображение Hibernate XML

Классы моделей и их файл отображения 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. DAO Class

Создайте классUserDao для загрузки пользователей из базы данных через 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

Создайте собственныйUserDetailsService, загрузите пользователя изUserDao, затем создайте полномочия пользователя.

Note
Пример является ссылкой изJdbcDaoImpl этой Spring

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. Spring Security XML

Прочитайте комментарии, это должно быть само за себя.

spring-security.xml



    
    
        

        
        
        
        
        
        
    

    
        
            
        
    

spring-database.xml



    
    

        
        
        
        
    

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

    
        
    

    
        
    

    
    
        
    

    
        
        
        
        
        
    

    
        
        
    

Готово.

Note
Эти файлы JSP, web.xml и контроллера опущены, это вполне стандартный код, если он вам интересен, пожалуйста, загрузите полный исходный код в конце статьи.

8. Проект Демо

Следующая видеодемонстрация предназначена для учебникаSpring Security database login with JDBC. Поскольку этот учебник генерирует тот же вывод, но использует Hibernate для загрузки пользователей, поэтому демонстрационная версия видео используется повторно.

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

Скачать исходный код

Скачать -spring-security-hibernate.zip (30 КБ)

Related