在没有插件 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的主要内容,如果未能解决你的问题,请参考以下文章

Spring中的配置文件文件位置

在servlet中的xml配置

idea中添加web.xml配置文件与tomcat启动中遇到的web.xml文件找不到的问题

tonmcat中的web项目中的web.xml为啥设置默认首页没有作用呢?

如何在没有 xml 的情况下配置 thymeleaf-extras-springsecurity4?

中文乱码问题处理