在没有插件 web.xml 问题的情况下配置 Spring Security
Posted
技术标签:
【中文标题】在没有插件 web.xml 问题的情况下配置 Spring Security【英文标题】:Configuring Spring Security without the plugin web.xml problems 【发布时间】: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 放在那里似乎是错误的。 【参考方案1】:我在不久前得到了这个工作,但它在 1.3 中的设置与在 1.2 中的设置不同。我发现我只能通过将外部 XML 文件添加到 web.xml 中的 contextConfigLocation 上下文参数来访问它们:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
/WEB-INF/applicationContext-security.xml
</param-value>
</context-param>
除了配置与非 Grails 应用程序相同。您可能还需要配置 jar。
此外,您应该使用 BuildConfig.groovy 中的 IVy 配置,而不是将 jar 复制到您的 lib 目录,这样您的机器上只有一个 jar 副本。这是应该工作的一个:
grails.project.class.dir = 'target/classes'
grails.project.test.class.dir = 'target/test-classes'
grails.project.test.reports.dir = 'target/test-reports'
grails.project.dependency.resolution =
inherits 'global'
log 'warn'
repositories
grailsPlugins()
grailsHome()
grailsCentral()
ebr() // SpringSource http://www.springsource.com/repository
dependencies
runtime('org.springframework.security:org.springframework.security.core:3.0.3.RELEASE')
excludes 'com.springsource.org.aopalliance',
'com.springsource.org.apache.commons.logging',
'org.springframework.beans',
'org.springframework.context',
'org.springframework.core'
runtime('org.springframework.security:org.springframework.security.config:3.0.3.RELEASE')
runtime('org.springframework.security:org.springframework.security.web:3.0.3.RELEASE')
excludes 'com.springsource.javax.servlet',
'com.springsource.org.aopalliance',
'com.springsource.org.apache.commons.logging',
'org.springframework.aop',
'org.springframework.beans',
'org.springframework.context',
'org.springframework.core',
'org.springframework.web'
【讨论】:
谢谢。那行得通。我正在安装 spring-security-core 插件,以便获得安全标签库。这是最好的方法还是有更好的方法?以上是关于在没有插件 web.xml 问题的情况下配置 Spring Security的主要内容,如果未能解决你的问题,请参考以下文章
idea中添加web.xml配置文件与tomcat启动中遇到的web.xml文件找不到的问题
tonmcat中的web项目中的web.xml为啥设置默认首页没有作用呢?