2013-08-21 193 views
0

不久之前,Spring为Spring Security模块提供了基于java的配置。我尝试从XML迁移到Java配置。 这里是我的测试项目:https://github.com/Fruzenshtein/security-sprSpring Security:带数据源的Java配置

pom.xml中被更新:

spring.version = 3.2.4.RELEASE spring.security.version = 3.1.4.RELEASE

... 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-javaconfig</artifactId> 
      <version>1.0.0.M1</version> 
     </dependency> 
... 
     <repository> 
      <id>repository.springsource.milestone</id> 
      <name>SpringSource Milestone Repository</name> 
      <url>http://repo.springsource.org/milestone</url> 
     </repository> 

然后我添加了一个新的java配置类而不是spring-security.xml

package com.sprsec.init; 

import javax.sql.DataSource; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 

import com.sprsec.service.CustomUserDetailsService; 

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private DataSource dataSource; 

    @Override 
    protected void registerAuthentication(AuthenticationManagerBuilder auth) throws Exception { 
     auth.jdbcAuthentication().dataSource(dataSource); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.userDetailsService(new CustomUserDetailsService()) 
      .authorizeUrls() 
      .antMatchers("/sec/moderation.html").hasRole("MODERATOR") 
      .antMatchers("/admin/**").hasRole("ADMIN") 
      .and() 
      .formLogin() 
      .loginPage("/user-login.html") 
      .defaultSuccessUrl("/success-login.html") 
      .failureUrl("/error-login.html") 
      .permitAll() 
      .and() 
      .logout() 
      .logoutSuccessUrl("/index.html"); 
    } 

} 

之后,我将Initializaer.class更改为:

package com.sprsec.init; 

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; 

public class Initializer extends 
     AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class[] { WebAppConfig.class }; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class[] { WebAppConfig.class }; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[] { "/" }; 
    } 

} 

备注:

  • 弹簧security.xml文件已被删除
  • 代码@ImportResource的线( “类路径:弹簧security.xml文件”)中的溶液在WebAppConfig.java
  • 删除
  • 删除web.xml中的过滤器声明

当我尝试在服务器上运行应用程序时,我得到:

SEVERE:上下文初始化失败 org.springframework.beans.factory.BeanCreationException:创建名为'webAppConfig'的bean时出错:bean初始化失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:在类路径资源[org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class]中定义名称为'org.springframework.transaction.config.internalTransactionAdvisor'的bean时出错:实例化豆失败;嵌套异常是org.springframework.beans.factory.BeanDefinitionStoreException:工厂方法[public org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration.transactionAdvisor()]引发异常;嵌套的异常是java.lang.NoSuchMethodError:org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor.setAdvice(Lorg/aopalliance/aop/Advice;)V

有人可以提出一个建议什么可以是这个原因吗?

回答

0

您可能会遇到一些依赖冲突。运行maven dependency:tree来确定使用哪些依赖关系并找出冲突的依赖关系。另外使用maven-enforcer-plugin可能会有所帮助。

看看您使用Spring 3.1.3的示例项目和Spring Security的示例项目,您希望为Spring和Spring安全提供单独的属性。

<properties> 
    <hibernate.version>4.1.7.Final</hibernate.version> 
    <mysql.connector.version>5.1.21</mysql.connector.version> 
    <slf4j.version>1.6.6</slf4j.version> 
    <spring.version>3.2.4.RELEASE</spring.version> 
    <spring.security.version>3.1.4.RELEASE<spring.security.version> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 

至于Spring Security的你可能想尝试新的3.2.0.RC1作为已经与包括改进和一些便利超新的春天的安全javaconfig。

您的配置最后需要说明的,因为这是有缺陷的,要复制你的bean的实例为您加载相同的配置两次(复制你的整个配置),无论是ContextLoaderListenerDispatcherServlet使用WebAppConfig进行配置。这可能会使您的安全无效。

提交了一个pull request这应该给你一些关于如何解决手头问题的指针。

+0

Hi和感谢 我做你建议,现在我没有任何错误,当我启动服务器 但一个新的问题是该项目的一个空的工作目录我已经开始后的所有修补程序的响应服务器。非常奇怪的行为 –

+0

检查它是否开始。正如我在提交中提到的那样,您应该添加maven war插件并为缺少的web.xml(您应该删除它)进行配置。 –

相关问题