我有一个适用于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吗?
答案 0 :(得分:1)
我已经对我的项目进行了一些更改,并且我不是100%确定实际修复了这个问题但是下面列出的最有可能的竞争者:
更改了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来控制角色访问,但是你省略了它们。