2

我正在尝试使用Spring3.1实现部分级别的安全性。使用Thymeleaf2.0作为我的视图部分。这是我为此所做的配置,

使用的罐子## - 所有spring3.1 罐子thymeleaf-extras-springsecurity3.jar(版本 1.0.0.beta-1)

SpringWebFlow-Servlet.xml

<bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
     ...
     <property name="additionalDialects">
     <set>
         <bean class="org.thymeleaf.extras.springsecurity3.dialect.SpringSecurityDialect"/>
     </set>
     </property>
     ...
</bean>
<bean id="webexpressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler" />

弹簧安全.xml

 <http auto-config="true" use-expressions="true">
     <intercept-url pattern="/productSelection" access="hasRole('ROLE_ADMIN')"/>
    .....
 </http>

xxx.html

<div sec:authorize="hasRole('ROLE_ADMIN')">
    This only be seen if authenticated user has role ROLE_ADMIN.
</div>

问题

获取异常说明:在 applicationContext 中找不到可见的 WebSecurityExpressionHandler 实例

在 Spring3.1 中,DefaultWebSecurityExpressionHandler 没有实现 WebSecurityExpressionHandler 并且该接口已被弃用。请让我知道解决方法,因为 Thymeleaf 正在尝试搜索 ApplicationContext 中不可用的 WebSecurityExpressionHandler 实例。

4

3 回答 3

3

您需要在应用程序(根)上下文而不是 servlet 上下文中定义 bean。

<bean id="webSecurityExpressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler"/>

我有同样的问题将它从 servlet-context.xml 移动到 root-context.xml 并且 bean 被拾取。

根据您的 spring 设置,它可以在另一个 xml 文件中,因此请检查您的 web.xml 中的 Spring 上下文根。

在您的情况下,如果 spring-security.xml 在您的 Spring 根上下文中导入,您可以将它添加到那里。

于 2014-12-03T14:45:54.633 回答
0

Spring Security 3.1.0 中的DefaultWebSecurityExpressionHandler类没有实现WebSecurityExpressionHandler接口,这可能是一个疏忽。

这在 Spring Security 3.1.1 和更新版本中得到了解决,因此您只需更新您的 Spring Security 依赖项。

于 2012-10-25T08:03:35.793 回答
0

这个问题已经很老了,但是对于任何在这里找到补充丹尼尔答案的人来说,您可以通过更改以下内容来更新您的 pom.xml 中的依赖项。

<properties>
    ...
    <!-- <spring-security.version>3.1.0.RELEASE</spring-security.version> -->
    <spring-security.version>3.1.1.RELEASE</spring-security.version>
</properties>

如果有人感兴趣,我也会在博客上提供更多信息

于 2013-08-21T16:19:50.010 回答