如何使用Spring安全性配置WebSecurityExpressionHandler?

时间:2012-07-18 13:48:02

标签: spring security taglib

我有一个适用于Spring 3.0的项目。我现在已经转移到Maven来控制依赖项并转移到Spring 3.1.2 jar和Spring security 3.1.1 jar。

当我尝试访问包含安全标记库(例如)的JSP时,我收到以下错误:

javax.servlet.ServletException: javax.servlet.jsp.JspException: java.io.IOException: No visible WebSecurityExpressionHandler instance could be found in the application context. There must be at least one in order to support expressions in JSP 'authorize' tags.

在我的安全环境中,我有:

<http auto-config="true" use-expressions="true" create-session="ifRequired"

从我的旧项目:

<beans:bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler" />

我在我的项目包里找不到那个类,所以认为它可能只是我尝试的类的移动:

<beans:bean id="expressionHandler" class="org.springframework.security.web.access.expression.WebSecurityExpressionHandler" />

这给了我同样的错误。

我目前配置的Spring-security依赖项: 弹簧安全核心3.1.1 弹簧安全标签库-3.1.1 弹簧安全ACL-3.1.1 弹簧安全配置-3.1.1 弹簧安全web的3.1.1

我错过了一个包含'use-expressions = true'需要的jar吗?

2 个答案:

答案 0 :(得分:1)

我已经对我的项目进行了一些更改,并且我不是100%确定实际修复了这个问题但是下面列出的最有可能的竞争者:

  • 我的应用程序的lib文件夹中隐藏了一些3.0个罐子。手动删除它们。
  • 完全从security-context中删除了expressionHandler定义
  • 更改了URL映射样式:

    <!-- Spring Security < 3.1
    These were inside the <http... > element
    <intercept-url pattern="/public/**" filters="none"/>
    <intercept-url pattern="/login" filters="none"/>
    <intercept-url pattern="/loggedOut" filters="none"/>
    <intercept-url pattern="/include/css/**" filters="none"/>
    <intercept-url pattern="/include/img/**" filters="none"/>
    -->
    

    在安全上下文中更改为以下元素:

    <!-- for Spring-security >= 3.1 -->
    <http pattern="/public/**" security="none"/>
    <http pattern="/login" security="none"/>
    <http pattern="/loggedOut" security="none"/>
    <http pattern="/include/css/**" security="none"/>
    <http pattern="/include/img/**" security="none"/>
    

我的元素现在写着:

        <http use-expressions="true" auto-config="true" create-session="ifRequired" access-denied-page="/accessDenied" >

我希望这可以帮助其他有类似问题的人从Spring security 3.0转移 - &gt; 3.1。

答案 1 :(得分:0)

事实并非如此, 我们使用拦截URL来控制角色访问,但是你省略了它们。