私はここでひびを入れるのがかなり難しいです..上記の3つのテクノロジーを私たちのウェブアプリに統合しようとしています..私たちは使用したい
- 春のウェブ
- ビューテクノロジーとしてのSpringMVC(フリーマーカー付き)
- セキュリティレイヤーとしての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セキュリティはイベントによって通知されず、フィルタは作動しません。