5

私はここでひびを入れるのがかなり難しいです..上記の3つのテクノロジーを私たちのウェブアプリに統合しようとしています..私たちは使用したい

  1. 春のウェブ
  2. ビューテクノロジーとしてのSpringMVC(フリーマーカー付き)
  3. セキュリティレイヤーとしてのSpringSecurity

しかし、どちらの方法でweb.xmlと他のコンテキストファイルを構成しても、すべてを同時に機能させることはできません。現在の構成では、SpringSecurityがURLパターンをインターセプトしないことを除いて、すべてが機能します。

いくつかのグーグル(そして常識)は、DispatcherServletとContextLoaderListenerを組み合わせることが問題になるかもしれないと私に言いました。

これが私の構成です。(たくさんのテキストをお詫びし、読んでくれてありがとう):

web.xml:

<!-- Needed by Spring -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/dw-manager-context.xml</param-value>
</context-param>

<!-- Needed by Spring MVC -->
<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<!-- Needed by Spring Security -->
<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>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

私のサーブレット-context.xml:

<!-- Scan for controllers -->
<context:component-scan base-package="dw.manager" />

<!-- Need to declare annotation driven transactions again so they are picked up above controller methods -->
<tx:annotation-driven transaction-manager="transactionManager" />

<mvc:annotation-driven />

<bean id="viewResolver"     class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <!-- ... -->
</bean>

<bean id="freemarkerConfig"
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <!-- ... -->
</bean>

私のmanager-context.xml:

<context:annotation-config />   

    <!-- deployment-setup just loads properties (files) -->
<import resource="deployment-setup.xml" />
<import resource="spring-security-context.xml" />
<import resource="dw-manager-datasource.xml" />

<!-- Import sub-modules -->
<import resource="classpath:dw-security-context.xml" />
<!-- ... -->

Spring-Security-context.xml:

<http pattern="/login" security="none" />
<http pattern="/accessDenied" security="none" />
<http pattern="/" security="none" />

<!-- enable use of expressions, define URL patterns and login/logout forms 
    and targets) -->
<http use-expressions="true" access-denied-page="/accessDenied">
    <intercept-url pattern="/*" access="hasRole('ROLE_USER')" />
    <!-- more stuff -->
</http>

<!-- a lot more... -->

manager-datasourceはデータベースをセットアップするだけです...


それをすべて読んでくれて、うまくいけば私を助けてくれてありがとう..;)


編集:いくつかの詳細

ContextLoaderListenerをスキップすることはできません。これは、SpringSecurityに必要です。また、これはContextLoaderListenerに必要なコンテキストであるため、contextConfigLocationをスキップすることはできません。名前を自分で定義するだけです。それ以外の場合は、applicationContext.xmlを検索します。たぶん私は空のcontextConfigLocationを追加できますか?しかし、それはおそらく、基礎となるモジュールが注入するBeanを見つけられないことを意味します。


edit2

主な問題は、SpringSecurityが機能するためにwebappコンテキスト(ContextLoaderListener)が必要であるが、Webアプリケーションがサーブレットコンテキスト内で実行されていることだと思います。コントローラメソッドはサーブレットコンテキストによってマップされるため、サーブレットコンテキストの「外部」で実行されているSpringセキュリティはイベントによって通知されず、フィルタは作動しません。

4

1 に答える 1

0

ため息..なぜそれが最初に機能しなかったのかわかりません。おそらく、正しいソリューションを試しているときに間違ったソリューションがキャッシュにありました。しかし、今は投稿したとおりに機能しています。お時間をいただきありがとうございます。

現在の唯一の問題:spring-test-mvcはSpring SecurityのFilterChainをサポートしていませんが、それは別の質問です。

于 2012-06-11T14:38:25.497 に答える