如何有条件地向具有Spring安全性的登录用户显示jsp内容

2022-09-01 00:16:44

我想向任何已登录的用户显示内容,并在未登录时隐藏。我正在使用jsp和弹簧安全性。

显然,一个本土种植的解决方案很容易做到。但是,实现这一目标的最干净的标准方法是什么?

Spring安全标签似乎没有很好的方式来允许将来添加新角色。


答案 1

我在以下方面取得了成功:

    <sec:authorize ifAnyGranted="ROLE_ANONYMOUS">
        <td><a href="<c:url value="/login.htm"/>">Login</a></td>
    </sec:authorize>
    <sec:authorize ifNotGranted="ROLE_ANONYMOUS">
        <td><a href="<c:url value="/j_spring_security_logout"/>">Logout</a></td>
    </sec:authorize>

可以在不影响此处的逻辑的情况下添加新角色。


为了使这个答案与Spring Security 3保持同步,到目前为止,使用和表达式在组合中效果很好,以实现相同的目标。下面是一个示例:isAnonymous()isAuthenticated()

<sec:authorize access="isAnonymous()">
    <form method="POST" action="<c:url value='j_spring_security_check'/>">
        Username: <input name="j_username" type="text" value="${SPRING_SECURITY_LAST_USERNAME}" /> 
        Password: <input name="j_password" type="password" /> 
        <input type="submit" value="Sign in" />
    </form>
</sec:authorize>
<sec:authorize access="isAuthenticated()">
    <a href="<c:url value="/j_spring_security_logout" />">Logout</a>
</sec:authorize>

答案 2

当前版本(3.1 甚至可能更早)支持将结果保存到属性中的 var 参数。通过该代码,您可以编写以下内容:

<sec:authorize var="loggedIn" access="isAuthenticated()" />
<c:choose>
    <c:when test="${loggedIn}">
        You are logged in
    </c:when>
    <c:otherwise>
        You are logged out
    </c:otherwise>
</c:choose>