Spring Security 3检查用户是否经过身份验证

时间:2015-05-27 10:47:31

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

我正在开发一个旧的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>
...

1 个答案:

答案 0 :(得分:0)

必须添加一个可供任何人访问的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>