4

なんらかの理由で (理由を思い出せません :))、Spring アプリケーションの構成には Java のみを使用することにしました。また、web.xmlを避けようとします

次の 2 つの Java 構成ファイルから始めました。ApplicationBootstrap.java

public class ApplicationBootstrap implements WebApplicationInitializer {
    //public class Initializer 
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(ApplicationConfig.class);
        rootContext.refresh();

    // Manage the lifecycle of the root appcontext
    servletContext.addListener(new ContextLoaderListener(rootContext));
    servletContext.setInitParameter("defaultHtmlEscape", "true");
    servletContext.setInitParameter("spring.profiles.active", "Production");


     // now the config for the Dispatcher servlet
    AnnotationConfigWebApplicationContext mvcContext = new AnnotationConfigWebApplicationContext();
        mvcContext.register(ApplicationConfig.class);
        mvcContext.getEnvironment().setActiveProfiles("Production");
        mvcContext.getEnvironment().setDefaultProfiles("Production");

    ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(mvcContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/api/*");


}

および ApplicationConfig.java

@Configuration()
@Profile({"Production", "ControllerUnitTest"})
@EnableWebMvc
@ComponentScan( basePackages = "com.consius.activework.server"  ) 
@EnableAspectJAutoProxy
public class ApplicationConfig extends WebMvcConfigurerAdapter {


}

これは期待どおりに機能しました。いいえ、私の問題が始まりました。私の考えは spring-security を使用することであり、Java を使用して spring-security を構成する方法を探しました。しばらくしてあきらめましたが、Java を使用して spring-security を構成する方法が見つかりませんでした。私は、セキュリティ構成のために XML に戻ることにしました。

これを含む web.xml を作成しました。

   <filter>
        <filter-name>filterChainProxy</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filterChainProxy</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

ApplicationConfig.java に次を追加しました。

 @ImportResource( { "classpath:/spring-security.xml" } )

そして、spring-security.xml という名前の新しい xml ファイルを作成しました

<security:http auto-config='true' create-session="never" realm="Restricted Service" use-expressions="true">
    <security:intercept-url pattern="/rest/**" access="permitAll()" />               
</security:http>

ドキュメントによると、これは最小限の構成です。

これを実行しようとすると、次のエラーが発生します(理由がわかりません)

SEVERE: Exception starting filter filterChainProxy
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'filterChainProxy' is defined
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:549)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1096)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:278)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1121)
    at org.springframework.web.filter.DelegatingFilterProxy.initDelegate(DelegatingFilterProxy.java:326)
    at org.springframework.web.filter.DelegatingFilterProxy.initFilterBean(DelegatingFilterProxy.java:236)
    at org.springframework.web.filter.GenericFilterBean.init(GenericFilterBean.java:194)
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281)

誰でも私を助けることができますか?私は明らかに間違ったことをしたと思いますが、それを見ることはできません。

//lg

4

4 に答える 4

11

Java 構成に固執するのはどうですか?

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    // ...
}

public class WebSecurityInitializer 
        extends AbstractSecurityWebApplicationInitializer {
}

便利なことに、WebSecurityInitializer は Spring Security Servlet フィルターを登録します! これは、多くの詳細を含む素晴らしい説明です。

http://docs.spring.io/spring-security/site/docs/3.2.x/guides/helloworld.html

ところで...上記がなくても、手動で登録することもできます:

public class DispatcherServletInitializer 
        extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    public void onStartup(ServletContext servletContext) 
            throws ServletException {
        servletContext
            .addFilter("securityFilter", 
                       new DelegatingFilterProxy("springSecurityFilterChain"))
            .addMappingForUrlPatterns(null, false, "/*");

        super.onStartup(servletContext);
    }

    // Various other required methods...

}

このようにして、面倒な web.xml を忘れることができます。:)

于 2014-01-14T14:14:42.130 に答える
6

セキュリティ用のフィルターの名前はspringSecurityFilterChain、Spring-security 名前空間によって Spring Bean に割り当てられた名前である必要があります。

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

さらにApplicationConfig、ルート コンテキスト (ContextLoaderListener を介してロード) と Web アプリケーション コンテキスト (DispatcherServlet を介してロード) の両方に使用した場合、両方に異なるコンテキストを保持し、ルート コンテキストのみを介して Spring セキュリティをロードすることをお勧めします。

更新 コメントで質問を明確にするために-Spring MVCアプリケーションには通常、2つのアプリケーションコンテキストがロードされますContextLoaderListener。ルートコンテキストの子であり、ルートコンテキストで定義された Bean が表示されます。ルート コンテキストにはコア アプリケーション関連の Bean (サービス、リポジトリ、エンティティ マネージャー、セキュリティなど) が含まれ、サーブレット アプリケーション コンテキストには Spring MVC に必要なもの (コントローラー、ビュー リゾルバーなど) だけが含まれます。あなたの場合、ルートコンテキストとサーブレットコンテキストの両方の一部として指定しましたが、これは必須ではありません。代わりに使用できますRoot Web Application ContextDispatcherServletServlet Web Application ContextApplicationConfigApplicationConfigルート コンテキストと同様に、Web アプリケーション コンテキストに別の MVC 固有のコンテキストを使用します。

于 2013-02-16T15:02:55.530 に答える
1

Spring 3.1+ を使用している場合は、コンテキスト構成の一部を web.xml に追加してみてください。それはすべてを結びつけます。Web 構成なしで簡単に動作させるには、次のようなことを試してください。

servletContext.addFilter(
            "springSecurityFilterChain",
            new DelegatingFilterProxy("springSecurityFilterChain"))
        .addMappingForUrlPatterns(null, false, "/*");
于 2013-04-24T01:38:06.410 に答える
0

DeleagatingFilterProxy docから

Filter インターフェースを実装する Spring 管理の Bean に委任する、標準の Servlet 2.3 Filter のプロキシ。

デフォルトでは、この実装はすべての呼び出しをフィルターと同じ名前の Bean に委任します。(あなたの場合はですfilterChainProxy)。したがって、名前付きのBeanを定義する必要があり、このBeanはインターフェースfilterChainProxyを実装する必要がありますFilter

しかし、Spring Security は、Spring Securityに適したspringSecurityFilterChainimplementationという名前の Bean を提供します。Filterフィルタの名前を に変更しますspringSecurityFilterChain

このリンクはあなたを助けるかもしれません

于 2013-02-16T14:55:38.877 に答える