2

我有一个在 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 依赖项:spring-security-core-3.1.1 spring-security-taglibs-3.1.1 spring-security-acl-3.1.1 spring-security-config-3.1.1 spring-security -web-3.1.1

我是否错过了一个包含任何“use-expressions = true”需要的罐子?

4

2 回答 2

1

从那以后,我对我的项目进行了许多更改,但我不能 100% 确定哪个确实解决了这个问题,但最有可能的竞争者如下:

  • 我的应用程序的 lib 文件夹中隐藏了一些 3.0 jar。手动删除它们。
  • 完全从 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 -> 3.1 迁移。

于 2012-07-27T10:18:33.337 回答
0

这不是真的,我们使用拦截 url 来控制角色访问,但你省略了它们。

于 2013-07-02T11:53:18.473 回答