2

この記事に従って、web.xml を使用せずに基本的な http-auth を試しました。

私は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;
//  }

}

最後に、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

サーバーの初期化をデバッグするときに、実際には次の 2 つのメソッドが呼び出されるため、その理由はわかりません。

@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が、何もしていなかったのでspringSecurityFilterChain、メソッドを使用して登録しようとしましたregisterServletFilterが、http-auth リクエスト認証を取得していません。またSecurityConfiguration、ロードされません。

4

1 に答える 1

7

SecurityInitializer は、springSecurityFilterChain の名前で Bean を検索するために使用される DelegatingFilterProxy を作成します。springSecurityFilterChain は @EnableWebSecurity を使用して作成されます。問題は、アノテーションが欠落していることです@Configuration(アノテーションがないと、ルート ApplicationContext は SecurityConfiguration を読み込もうとしません)。具体的には、次のことを行います。

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

指摘すべきいくつかの追加事項:

  • @Order他のフィルタを追加していないため、 を使用する必要はありません
  • 保護した唯一の URL は、コンテキスト ルート (つまり /) です。
  • 基本認証のみを示す必要な春のセキュリティ Java 構成の例で説明されている httpBasic() のバグに注意する必要があります。
  • 更新: SPR-10660@Enable*を既にログに記録して、注釈を付けずに注釈をサポートしていることも指摘する必要があり@Configurationました。それが解決された後、あなたの問題は魔法のように消えます.
于 2013-07-11T19:51:18.693 に答える