2012-12-16 260 views
0

我目前在实现Spring 3 + Hibernate + JPA + Spring Security 3.1 解决方案时遇到了麻烦。Spring 3 + Hibernate + JPA + Spring Security 3.1

这里是我的web.xml

 <?xml version="1.0" encoding="UTF-8"?> 
     <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com /xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns /javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath:security-context.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<!-- <listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
</listener> --> 

<servlet> 
    <servlet-name>spring</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath:applicationContext.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>spring</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

这里是我的应用程序上下文

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
         http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd 
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 

<context:annotation-config /> 
<context:component-scan base-package="com.muuves.reservosity" /> 

<mvc:annotation-driven /> 
<bean id="tilesConfigurer" 
    class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> 
    <property name="definitions"> 
     <list> 
      <value>/WEB-INF/tiles/tiles.xml</value> 
     </list> 
    </property> 
</bean> 

<bean class="org.springframework.web.servlet.view.tiles2.TilesViewResolver"> 
    <property name="viewClass" 
     value="org.springframework.web.servlet.view.tiles2.TilesView" /> 
</bean> 

<tx:annotation-driven /> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    <property name="dataSource" ref="dataSource" /> 

</bean> 

<beans profile="prod"> 
    <bean class="java.net.URI" id="dbUrl"> 
     <constructor-arg value="#{systemEnvironment['CLEARDB_DATABASE_URL']}" /> 
    </bean> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="url" 
      value="#{ 'jdbc:mysql://' + @dbUrl.getHost() + @dbUrl.getPath() }" /> 
     <property name="username" value="#{ @dbUrl.getUserInfo().split(':')[0] }" /> 
     <property name="password" value="#{ @dbUrl.getUserInfo().split(':')[1] }" /> 
    </bean> 

    <bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
     </property> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <!-- change this to 'verify' before running as a production app --> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
       <prop key="hibernate.connection.pool_size">10</prop> 
       <prop key="hibernate.current_session_context_class">thread</prop> 
      </props> 
     </property> 
    </bean> 
</beans> 

这里是我的安全上下文

<?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:security="http://www.springframework.org/schema/security" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans.xsd 
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
         http://www.springframework.org/schema/security 
         http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 
<security:global-method-security 
    secured-annotations="enabled" /> 

<security:http auto-config='true'> 
    <security:intercept-url pattern="/welcome*" 
     access="IS_AUTHENTICATED_ANONYMOUSLY" /> 
    <security:intercept-url pattern="/secure/**" 
     access="ROLE_USER" requires-channel="https" /> 
    <security:intercept-url pattern="/**" access="ROLE_USER" 
     requires-channel="any" /> 
</security:http> 

<!-- <security:authentication-manager> <security:authentication-provider> 
    <security:user-service> <security:user name="mkyong" password="123456" authorities="ROLE_USER" 
    /> </security:user-service> </security:authentication-provider> </security:authentication-manager> --> 

<bean id="AccessService" class="com.muuves.reservosity.service.AccessService" /> 


<security:authentication-manager> <security:authentication-provider 
    user-service-ref="AccessService"> <security:password-encoder hash="md5" /> 
    </security:authentication-provider> </security:authentication-manager> 

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.List; 
import java.util.logging.Logger; 

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

import org.springframework.dao.DataAccessException; 
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.transaction.annotation.Transactional; 

import com.muuves.reservosity.model.Company_Details; 


@Transactional(readOnly = true) 
@Service 
public class AccessService implements UserDetailsService{ 

private final static Logger LOG = Logger.getLogger(AccessService.class.getName()); 

@PersistenceContext 
EntityManager em; 

@Override 
public UserDetails loadUserByUsername(String username) throws DataAccessException{ 
    LOG.info("loadUserByUsername"); 
    LOG.info(username); 
    Company_Details domainUser = em.find(Company_Details.class, 1); 
    LOG.info(username); 
    LOG.info(domainUser.getEmail()); 
    LOG.info(domainUser.getPassword()); 
    boolean enabled = true; 
    boolean accountNonExpired = true; 
    boolean credentialsNonExpired = true; 
    boolean accountNonLocked = true; 

    return new User("[email protected]", "test1234", enabled, accountNonExpired, 
      credentialsNonExpired, accountNonLocked, 
      getAuthorities(1)); 
} 

/** 
* Retrieves a collection of {@link GrantedAuthority} based on a numerical 
* role 
* 
* @param role 
*   the numerical role 
* @return a collection of {@link GrantedAuthority 

*/ 
public Collection<? extends GrantedAuthority> getAuthorities(Integer role) { 
    List<GrantedAuthority> authList = getGrantedAuthorities(getRoles(role)); 
    return authList; 
} 

/** 
* Converts a numerical role to an equivalent list of roles 
* 
* @param role 
*   the numerical role 
* @return list of roles as as a list of {@link String} 
*/ 
public List<String> getRoles(Integer role) { 
    List<String> roles = new ArrayList<String>(); 

    if (role.intValue() == 1) { 
     roles.add("ROLE_USER"); 
     roles.add("ROLE_ADMIN"); 

    } else if (role.intValue() == 2) { 
     roles.add("ROLE_USER"); 
    } 

    return roles; 
} 

/** 
* Wraps {@link String} roles to {@link SimpleGrantedAuthority} objects 
* 
* @param roles 
*   {@link String} of roles 
* @return list of granted authorities 
*/ 
public static List<GrantedAuthority> getGrantedAuthorities(
     List<String> roles) { 
    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
    for (String role : roles) { 
     authorities.add(new SimpleGrantedAuthority(role)); 
    } 
    return authorities; 
} 

}

这里是我的WEB-INF/persistent.xml

<?xml version="1.0" encoding="utf-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
     version="2.0"> 

<persistence-unit name="dataSource" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
</persistence-unit> 

</persistence> 

这里是我的pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org /2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org /xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>com.example</groupId> 
<artifactId>spring-hibernate-template</artifactId> 
<packaging>war</packaging> 
<version>0.0.1-SNAPSHOT</version> 

<properties> 
    <org.springframework.version>3.1.1.RELEASE</org.springframework.version> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.0.1</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>taglibs</groupId> 
     <artifactId>standard</artifactId> 
     <version>1.1.2</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
     <version>1.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hsqldb</groupId> 
     <artifactId>hsqldb</artifactId> 
     <version>2.2.8</version> 
    </dependency> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.20</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-dbcp</groupId> 
     <artifactId>commons-dbcp</artifactId> 
     <version>1.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>3.6.10.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>com.github.jsimone</groupId> 
     <artifactId>webapp-runner</artifactId> 
     <version>7.0.27.1</version> 
     <scope>provided</scope> 
    </dependency> 


    <!-- Tiles dependency --> 
    <dependency> 
     <groupId>org.apache.tiles</groupId> 
     <artifactId>tiles-core</artifactId> 
     <version>2.2.1</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.tiles</groupId> 
     <artifactId>tiles-jsp</artifactId> 
     <version>2.2.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tiles</groupId> 
     <artifactId>tiles-api</artifactId> 
     <version>2.2.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tiles</groupId> 
     <artifactId>tiles-servlet</artifactId> 
     <version>2.2.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tiles</groupId> 
     <artifactId>tiles-template</artifactId> 
     <version>2.2.1</version> 
    </dependency> 

    <!-- Security --> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-core</artifactId> 
     <version>3.1.3.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-web</artifactId> 
     <version>3.1.3.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-config</artifactId> 
     <version>3.1.3.RELEASE</version> 
    </dependency> 
</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.2</version> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.4</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>copy</goal> 
        </goals> 
        <configuration> 
         <artifactItems> 
          <artifactItem> 
           <groupId>com.github.jsimone</groupId> 
           <artifactId>webapp-runner</artifactId> 
           <version>7.0.27.1</version> 
            <destFileName>webapp-runner.jar</destFileName> 
          </artifactItem> 
         </artifactItems> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

不知道为什么它不工作,不知道为什么我必须为AccessService创建一个id,因为我认为它会通过它的Annotation来检索它!认真地失去了这一点,并尝试了很多不同的例子在网络上,如果有人能帮助我,这将是非常棒的!

我有春,休眠和JPA的工作,我有春,休眠和JPA和硬编码的春季安全实施

<security:authentication-manager> <security:authentication-provider> 
<security:user-service> <security:user name="mkyong" password="123456" authorities="ROLE_USER" /> 
    </security:user-service> 
</security:authentication-provider> </security:authentication-manager> 

我不能联系起来Hibernate和Spring安全实施

谢谢

安德鲁

回答

0

我使用Spring + Hibernate的JPA + +的Spring Security在MP应用程序,并且我得到了它的工作将问题分解成婴儿步骤。这是我会推荐的。

  • 第1步:在您的应用程序配置JPA和的Hiberante与Spring得到了该工作,当你遇到问题后的
  • 步骤2:把春季安全工作和岗位的具体问题与配置当你进入他们。

回答一个狭隘的焦点问题比一般问题要容易得多。

+0

嗨,我有JPA和休眠工作,并获得春季安全使用硬编码用户名和密码在<安全:身份验证管理器><安全:身份验证提供程序>但我似乎无法连接身份验证提供程序连接搜索我的数据库 user1408682

+0

我第二@ams推荐,尝试分解它。首先让它使用[最小配置](http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#ns-minimal)。 – elias

+0

@elijunior我已经工作了,我只是无法让它与hibernate和spring安全性一起使用customuserdetails实现 – user1408682