4

Spring SecuirtyConfig を Spring MVC および JavaConfig と連携させようとしていますが、次のエラーが発生します。

java.lang.IllegalStateException: WebApplicationContext が見つかりません: ContextLoaderListener が登録されていませんか? org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:251)

これが私の SampleSimpleWebSecurityConfig です。

@Configuration
@EnableWebSecurity
public class SampleSimpleWebSecurityConfig extends SimpleWebSecurityConfig {

    private static final Logger logger = LoggerFactory.getLogger(SampleSimpleWebSecurityConfig.class);

    protected void authorizeUrls(ExpressionUrlAuthorizationRegistry interceptUrls) {

        logger.warn("* * Loadinging Role(s) * *");
        interceptUrls
                .antMatchers("/*").permitAll()
                .antMatchers("/ask-union").hasRole("ROLE_VERIFIED_MEMBER");
    }

    protected void configure(
            SecurityFilterChainSecurityBuilder springSecurityFilterChain) throws Exception {
        springSecurityFilterChain
                .formLogin()
                .permitAll();
    }

    protected void registerAuthentication(AuthenticationRegistry registry) throws Exception {
        registry
                .inMemoryAuthentication()
                .withUser("xxxx@aol.com.dev").password("testing").roles("ROLE_VERIFIED_MEMBER").and();

    }
}

ここに私のweb.xmlがあります:

 <servlet>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </init-param>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>org.xxxx.inquiryconfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<filter>
    <filter-name>securityFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
        <param-name>org.xxxx.inquiryconfig.SampleSimpleWebSecurityConfig</param-name>
        <param-value>springSecurityFilterChain</param-value>
    </init-param>
</filter>

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

私の古いSpring Secuirt XML:

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


    <global-method-security pre-post-annotations="enabled" />

    <http use-expressions="true">
        <intercept-url access="hasRole('ROLE_VERIFIED_MEMBER')" pattern="/ask**" />
        <intercept-url pattern='/*' access='permitAll' />
        <form-login default-target-url="/visit" />

        <logout logout-success-url="/" />
    </http>

    <authentication-manager>
        <authentication-provider>
            <user-service>
                <user name="XXXX@aol.com.dev" password="testing" authorities="ROLE_VERIFIED_MEMBER" />
            </user-service>

        </authentication-provider>
    </authentication-manager>
</beans:beans>
4

2 に答える 2

4

あなたのエラーは次のように述べています:

java.lang.IllegalStateException: WebApplicationContext が見つかりません: ContextLoaderListener が登録されていませんか? org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:251)

したがってContextLoaderListener、フィルターとサーブレットの前に、web.xml に a を登録するだけです。

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

の場合、applicationContextweb.xml にコンテキスト パラメータを追加します。

<context-param>
    <param-name>contextClass</param-name>
    <param-value>com.yourcompany.yourclass</param-value>
</context-param>

com.yourcompany.yourclassアプリケーション コンテキスト構成クラスはどこにありますか。

典型的な Spring MVC アプリケーションには、アプリケーション コンテキストとサーブレット コンテキストの 2 つのコンテキストがあり、アプリケーションはルートまたは親であり、サーブレット コンテキストはその子です。ContextLoaderListener は、アプリケーション コンテキストをリッスンします。これは、デフォルトで見つかった/WEB-INF/applicationContext.xmlものであり、Spring がそこで探しているのですが、見つかりません。Java@Configurationクラスを使用していると仮定しているので、そのクラスを指してください。

于 2013-03-20T17:49:16.210 に答える
2

Sotirios はこれをほぼ正しく理解しました。彼が述べたように、親と子の 2 つの異なる構成があります。以下に投稿している構成のバリエーションは、samples/social/src/main/webapp/WEB-INF/web.xml にあります (つまり、Spring Social を使用した Spring Security Java Config のデモ)。

Spring Security は通常、親コンテキストで構成されます。これを web.xml の Java 構成で行うには、次のようにします。

<!-- Java-based Spring container definition -->
<context-param>
    <param-name>contextClass</param-name>
    <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>

<!-- Location of Java @Configuration classes that configure the components that makeup this application -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>org.xxxx.inquiryconfig.SampleSimpleWebSecurityConfig</param-value>
</context-param>

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

<!-- use the springSecurityFilterChain -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <!-- NOTE This does not specify its own configuration it is
         loaded by the ContextLoaderListener instead -->

    <!-- NOTE by default the filter name is used to
         look up the Spring Security Filter Chain if you like you
         can use any filter name you want, but you must specify
         the bean name instead in this instance. Since we use the
         springSecurityFilterChain as the filter name this is not
         necessary
    <init-param>
        <param-name>targetBeanName</param-name>
        <param-value>springSecurityFilterChain</param-value>
    </init-param> -->
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Spring MVC 構成と親コンテキストが重複しないことが重要です。そうしないと、オブジェクトが重複して作成されます (つまり、親に 1 つと子に 1 つ)。具体的には、DispatcherServlet の contextConfigLocation が ContextLoaderListener の contextConfigLocation と同じクラスをロードしないようにする必要があります。

アップデート:

また、URL が正しい順序で指定されていることを確認する必要もあります。現在の問題は、/* が /ask-union と同じ URL に一致することです。各パターンが順番に試されることを覚えておいてください。これは、ask-union に到達するように、以下に示すように構成を更新する必要があることを意味します。hasRole は自動的に ROLE_ プレフィックスを挿入するため、「ROLE_」部分も削除する必要があります。

    interceptUrls
            .antMatchers("/ask-union").hasRole("VERIFIED_MEMBER")
            .antMatchers("/*").permitAll();
于 2013-03-20T21:18:41.257 に答える