【发布时间】:2011-05-16 04:21:58
【问题描述】:
我目前正在构建一个 Grails 1.3.5 应用程序。它使用现有的模型层(共享代码 - 没有 GORM),我已经在 conf/spring/resources.xml 中成功地为其配置了 tomcat jndi 连接,并且一切正常。但是,当我尝试配置 Spring 安全性时遇到问题。我没有使用 spring 安全插件,因为我想使用我们已经运行的另一个项目的 xml 安全配置。这使用 Spring 3 安全性。我在各种博客上按照以下步骤操作:
- 运行“grails install-templates”
我在 templates/war/web.xml 中添加了以下内容:
<filter>
<filter-name>Spring Security Filter Chain Proxy</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>filterChainProxy</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Spring Security Filter Chain Proxy</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
- 我将安全 bean 添加到 conf/spring 目录并拥有 验证了它们。
- 我已经复制了spring security jar 文件转移到 grails lib 目录。版本 3.0.2
当我运行“grails run-app”时,web.xml 出现了一个非常奇怪的异常:
2010-11-26 12:16:02,512 INFO [startup.ContextConfig] No default web.xml
2010-11-26 12:16:02,518 ERROR [digester.Digester] End event threw exception
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.tomcat.util.IntrospectionUtils.callMethod1(IntrospectionUtils.java:925)
...
Caused by: java.lang.IllegalArgumentException: Filter mapping specifies an unknown filter name hiddenHttpMethod
at org.apache.catalina.core.StandardContext.addFilterMap(StandardContext.java:2251)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.tomcat.util.IntrospectionUtils.callMethod1(IntrospectionUtils.java:925)
at org.apache.tomcat.util.digester.SetNextRule.end(SetNextRule.java:193)
at org.apache.tomcat.util.digester.Rule.end(Rule.java:229)
at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1140)
... 437 more
我还从其他建议的博客中复制了过滤器代码:
<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>
但我仍然遇到同样的问题。
有人对我接下来应该尝试什么有任何建议吗?烦人的是,我在旧版本的 Grails (1.1.1) 上使用了版本 2 的安全模块,但现在我遇到了问题。
【问题讨论】:
-
顺便说一句,我已经设法让同一个应用程序使用 Spring Security 2.0.4 工作。除了安全 bean 定义略有不同之外,我已经以相同的方式配置了所有内容。安全 v3 使用:org.springframework.web.filter.DelegatingFilterProxy 而 v2 使用:org.springframework.security.util.FilterToBeanProxy。我克服了上述错误并得到'没有定义名为'Spring Security Filter Chain Proxy'的bean'。它在 config/spring/ 中定义,但不在 web-app/WEB-INF/ApplicationContext.xml 中。不过,将 bean defs 放在那里似乎是错误的。
标签: tomcat grails spring-security