2013-07-11 84 views
2

我下面这个article尝试一个基本的HTTP-AUTH不使用的web.xml的Tomcat 7和AbstractSecurityWebApplicationInitializer工作不在一起

我使用Tomcat 7.0.41的,而这些都是我的gradle上依赖:

ext.springVersion = "3.2.1.RELEASE" 
    compile "org.springframework:spring-jdbc:$springVersion", 
      "org.springframework:spring-context:$springVersion", 
      "org.springframework:spring-web:$springVersion", 
      "org.springframework:spring-webmvc:$springVersion", 
      "org.springframework.security:spring-security-core:3.2.0.M2", 
      "org.springframework.security:spring-security-web:3.2.0.M2", 
      "org.springframework.security:spring-security-config:3.2.0.M2", 

根据教程我定义的下列

@EnableWebSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void registerAuthentication(AuthenticationManagerBuilder auth) 
      throws Exception { 
     auth.inMemoryAuthentication().withUser("admin").password("admin") 
       .roles("USER"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeUrls().antMatchers("/").hasRole("USER") 
       .and().httpBasic(); 
    } 

} 

然后加入该类到这样的初始化:

@Order(1) 
public class ServletConfiguration extends 
     AbstractAnnotationConfigDispatcherServletInitializer { 

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

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

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

// @Override 
// protected Dynamic registerServletFilter(ServletContext servletContext, 
//   Filter filter) { 
//  Dynamic securityFilter = servletContext.addFilter(
//    "springSecurityFilterChain", DelegatingFilterProxy.class); 
//  securityFilter.addMappingForUrlPatterns(
//    EnumSet.allOf(DispatcherType.class), false, "/*"); 
//  return securityFilter; 
// } 

} 

,最后增加了一个类来inizialize的springSecurityFilterChain:

@Order(2) 
public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer { 
@Override 
protected void afterSpringSecurityFilterChain(ServletContext servletContext) { 
    System.out.println("afterSpringSecurityFilterChain"); 
    super.afterSpringSecurityFilterChain(servletContext); 
} 
} 

但我总是收到此错误:

DEBUG: org.springframework.jndi.JndiPropertySource - JNDI lookup for name [spring.liveBeansView.mbeanDomain] threw NamingException with message: Name [spring.liveBeansView.mbeanDomain] is not bound in this Context. Unable to find [spring.liveBeansView.mbeanDomain].. Returning null. 
Jul 11, 2013 9:22:24 PM org.apache.catalina.core.StandardContext filterStart 
SEVERE: Exception starting filter springSecurityFilterChain 
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSecurityFilterChain' is defined 

我不知道为什么,虽然,因为当我去调试服务器初始化,实际上这两种方法叫做:

@Override 
public final void onStartup(ServletContext servletContext) 
     throws ServletException { 
    if(enableHttpSessionEventPublisher()) { 
     servletContext.addListener(HttpSessionEventPublisher.class); 
    } 
    insertSpringSecurityFilterChain(servletContext); 
    afterSpringSecurityFilterChain(servletContext); 
} 

然后

private void insertSpringSecurityFilterChain(ServletContext servletContext) { 
    String filterName = "springSecurityFilterChain"; 
    DelegatingFilterProxy springSecurityFilterChain = new DelegatingFilterProxy(filterName); 
    String contextAttribute = getWebApplicationContextAttribute(); 
    if(contextAttribute != null) { 
     springSecurityFilterChain.setContextAttribute(contextAttribute); 
    } 
    registerFilter(servletContext, true, filterName, springSecurityFilterChain); 
} 

因此,实际上过滤器被创建。但随后它会在某处丢失。

我试图玩@Order,但那样做什么都没做,所以我试图用registerServletFilter方法注册springSecurityFilterChain,但我没有得到任何http-auth请求认证。 而且SecurityConfiguration doens't甚至得到加载。

回答

7

SecurityInitializer创建DelegatingFilterProxy,用于通过名称springSecurityFilterChain查找bean。 springSecurityFilterChain是使用@EnableWebSecurity创建的。问题是你缺少@Configuration注释(没有它,根ApplicationContext甚至不会尝试加载SecurityConfiguration)。具体要做到以下几点:

@Configuration 
@EnableWebSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 
... 
} 

了一些其他的事情要指出:

  • 你并不需要使用@Order,因为您不添加任何其他过滤器
  • 唯一您已获得的URL是上下文根(即/)。
  • 你会想知道与httpBasic()中的错误是在need spring security java config example showing basic auth only
  • UPDATE讨论:我应该也指出,我已经登录SPR-10660支持@Enable*注解,而不必对他们@Configuration。在解决之后,你的问题会神奇地消失。
+0

非常感谢!我读了更多次。虽然这个问题有助于了解这个错误。再次感谢! – dierre

+0

没问题@dierre :)注意:我添加了一个更新,指向另一个JIRA,一旦解决了这个问题就会为您解决这个问题。 –

+0

我看到SPR-10660在2.5年后仍然没有解决。 –