【问题标题】:Spring Security 3 check if user is authenticatedSpring Security 3 检查用户是否经过身份验证
【发布时间】:2015-08-09 09:51:01
【问题描述】:

我正在处理一个旧的 Spring 3.0.7 项目。我必须添加一个任何人都可以访问的jsp。我必须检查登陆此页面的人是经过身份验证的还是匿名的,所以我决定使用这个

<security:authorize access="isAuthenticated()">
...
</security:authorize>
<security:authorize access="isAnonymous()">
....
</security:authorize>

向用户显示适当的内容。当我以登录用户身份登陆jsp 时,一切都很好。当我在没有登录的情况下登陆时 isAuthenticated() 不会返回 false 但会引发异常:

java.lang.RuntimeException: org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: org.springframework.beans.NotReadablePropertyException: Invalid property 'principal.username' of bean class [org.springframework.security.authentication.AnonymousAuthenticationToken]: Bean property 'principal.username' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

我对 Spring 很陌生,当然我想念一些东西。但是什么?

更新

这是我的jsp相关代码:

<%@ page isELIgnored="false" contentType="text/html" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>

<content tag="top">
    <security:authorize access="isAuthenticated()">
        <!-- authenticated users content -->
    </security:authorize> 
    <security:authorize access="isAnonymous()">
        <li><a href="${contextPath}/"><i class="login"></i> Login</a></li>
    </security:authorize>       
</content>
...

【问题讨论】:

标签: java spring jsp spring-mvc spring-security


【解决方案1】:

必须添加任何人都可以访问的jsp??

然后不要将该jsp包含在下面的security.xml文件中。

在配置元素中,您可以使用一个或多个元素限制对特定 URL 的访问。每个元素指定一个 URL 模式和一组访问 URL 所需的访问属性。请记住,您必须始终在 URL 模式的末尾包含通配符。否则会导致 URL 模式无法匹配具有请求参数的 URL。

 <security:http auto-config="true" >  
 <security:intercept-url pattern="/index*" access="ROLE_USER" />
 <security:intercept-url pattern="/Transit*" access="ROLE_USER" />
 <security:form-login login-page="/login.htm" default-target-url="/index.htm"  
  authentication-failure-url="/loginerror.htm" />  
 <security:logout logout-success-url="/logout.htm" />
 </security:http>

当我们要描述一个没有任何安全性的 url 时,我们应该在安全配置的 xml 文件下从上述代码行中删除特定的 url。例如,如果我们不需要任何安全索引页面,那么上面的编码应该是这样的。

     <security:http auto-config="true" >  
     <security:intercept-url pattern="/Transit*" access="ROLE_USER" />
     <security:form-login login-page="/login.htm" default-target-url="/index.htm"  
      authentication-failure-url="/loginerror.htm" />  
     <security:logout logout-success-url="/logout.htm" />
     </security:http>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-21
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2020-10-20
    相关资源
    最近更新 更多