使用Spring授权标签检查用户是否登录时出错?

2022-09-04 05:22:55

尝试测试以查看用户是否已登录,我正在使用以下代码:

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

<sec:authorize access="isAuthenticated()">
   YES, you are logged in!
</sec:authorize>

但是我得到了以下错误?

javax.servlet.jsp.JspException: 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.
        at org.springframework.security.taglibs.authz.AuthorizeTag.getExpressionHandler(AuthorizeTag.java:100)
        at org.springframework.security.taglibs.authz.AuthorizeTag.authorizeUsingAccessExpression(AuthorizeTag.java:58)
        at org.springframework.security.taglibs.authz.AuthorizeTag.doStartTag(AuthorizeTag.java:48)

答案 1

在 http 元素中设置 use-expressions=“true” 将起作用,但意味着 Java 代码和安全上下文中的所有安全设置都必须使用表达式表示法。如果您当前使用的是标准安全表示法,则这可能是一个问题。

要同时使用表达式和标准表示法,只需在安全上下文中声明一个新的Bean,如下所示 -

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

答案 2

若要使用表达式来保护各个 URL,首先需要将元素中的 use-expression 属性设置为 true

<http use-expressions="true"> 请参阅弹簧安全文档