SpringセキュリティHibernate XMLの例

Spring Security + Hibernate XMLの例

spring-hibernate-logo

このチュートリアルでは、Hibernate 4をSpring Securityに統合する方法、XML構成の例を示します。

Note
注釈バージョンについては、このSpring Security + Hibernate Annotation Exampleをお読みください。

使用される技術:

  1. Spring 3.2.8.RELEASE

  2. Spring Security 3.2.3.RELEASE

  3. Hibernate 4.2.11。最終

  4. MySQLサーバー5.6

  5. JDK 1.6

  6. メーベン3

  7. Eclipse 4.3

クイックノート

  1. hibernate4.LocalSessionFactoryBeanを使用してセッションファクトリを作成します

  2. セッションファクトリをUserDaoに挿入する

  3. Spring Securityと統合するには、UserDetailsServiceインターフェースを実装するクラスを作成し、UserDaoを使用してユーザーをロードします。

  4. トランザクションマネージャーを宣言する必要があります。宣言しないと、HibernateはSpringで動作しません。

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クラス

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. UserDetailsS​​ervice

カスタムUserDetailsServiceを作成し、UserDaoからユーザーをロードしてから、ユーザーの権限を構築します。

Note
例は、この春のJdbcDaoImplからの参照です。

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 KB)