Spring Security Hibernate XML-Beispiel

Beispiel für Spring Security + Hibernate XML

spring-hibernate-logo

In diesem Tutorial zeigen wir Ihnen, wie Sie Hibernate 4 in das XML-Konfigurationsbeispiel für Spring Security integrieren.

Note
Für eine Anmerkungsversion lesen Sie bitte dieseSpring Security + Hibernate Annotation Example.

Verwendete Technologien:

  1. Feder 3.2.8.FREIGABE

  2. Federsicherheit 3.2.3.FREIGABE

  3. Ruhezustand 4.2.11.Final

  4. MySQL Server 5.6

  5. JDK 1.6

  6. Maven 3

  7. Eclipse 4.3

Schnelle Notizen

  1. Erstellen Sie eine Sitzungsfactory mithibernate4.LocalSessionFactoryBean

  2. Injizieren Sie die Session Factory in ein UserDao

  3. Erstellen Sie zur Integration in Spring Security eine Klasse, die dieUserDetailsService-Schnittstelle implementiert und den Benutzer mit UserDao lädt

  4. Der Transaktionsmanager muss deklariert werden, sonst funktioniert Hibernate im Frühjahr nicht

1. Projektverzeichnis

Eine endgültige Projektverzeichnisstruktur.

spring-security-hibernate-directory

2. Projektabhängigkeit

Liste der Abhängigkeiten des Projekts in der POM-Datei.

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. Benutzertabellen

SQL-Skript zum Erstellen von Tabellen zum Speichern von Benutzern und Benutzerrollen.

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. Benutzermodell + Ruhezustand-XML-Zuordnung

Modellklassen und deren XML-Zuordnungsdatei.

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-Klasse

Erstellen Sie eineUserDao-Klasse, um Benutzer über den Ruhezustand aus der Datenbank zu laden.

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

Erstellen Sie ein benutzerdefiniertesUserDetailsService, laden Sie den Benutzer ausUserDao und erstellen Sie dann die Berechtigungen des Benutzers.

Note
Beispiel ist eine Referenz ausJdbcDaoImpl dieser Feder

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

Lies die Kommentare, es sollte selbsterklärend sein.

spring-security.xml



    
    
        

        
        
        
        
        
        
    

    
        
            
        
    

spring-database.xml



    
    

        
        
        
        
    

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

    
        
    

    
        
    

    
    
        
    

    
        
        
        
        
        
    

    
        
        
    

Erledigt.

Note
Diese JSP-, web.xml- und Controller-Dateien werden weggelassen. Es handelt sich um einen Standardcode. Wenn Sie daran interessiert sind, laden Sie bitte den vollständigen Quellcode am Ende des Artikels herunter.

8. Projekt Demo

Die folgende Video-Demo ist für das Tutorial vonSpring Security database login with JDBC. Da dieses Tutorial die gleiche Ausgabe generiert, aber den Ruhezustand zum Laden von Benutzern verwendet, wird die Videodemo wiederverwendet.

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

Quellcode herunterladen

Laden Sie es herunter -spring-security-hibernate.zip (30 KB)