0

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

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[] { "/" };
    }

}

评论:

  • spring-security.xml 被删除
  • WebAppConfig.java中删除了一行代码@ImportResource("classpath:spring-security.xml")
  • web.xml 中的过滤器声明已删除

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

严重:上下文初始化失败 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。

有人可以给出建议,这可能是什么原因?

4

1 回答 1

0

您可能遇到了一些依赖冲突。运行maven dependency:tree以找出使用了哪些依赖项并找到冲突的依赖项。此外,使用maven-enforcer-plugin可能会有所帮助。

查看您正在使用 Spring 3.1.3 的示例项目,对于 Spring Security 也是如此,您希望为 Spring 和 Spring Security 提供单独的属性。

<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,因为它已经包含了新的 Spring Security javaconfig,并进行了改进和一些便利的超类。

关于您的配置的最后一点说明,因为这是有缺陷的,您正在复制您的 bean 实例,因为您正在加载相同的配置两次(复制整个配置),同时ContextLoaderListener使用DispatcherServletforWebAppConfig配置。这可以有效地使您的安全性无用。

提交了一个拉取请求,它应该会给你一些关于如何解决手头问题的指示。

于 2013-08-22T07:09:52.440 回答