为什么在装饰器中调用安全认证属性`principal.displayName`会抛出exception?

是否有理由在装饰器中调用安全认证属性principal.displayName会导致问题?

我将它设置为sitemesh装饰器中的变量:

     

但是它会产生这个exception:

 java.lang.RuntimeException: javax.servlet.ServletException: javax.servlet.jsp.JspException: Invalid property 'principal.displayName' o f bean class [org.springframework.security.authentication.AnonymousAuthenticationToken]: Bean property 'principal.displayName' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter? at com.opensymphony.sitemesh.webapp.decorator.BaseWebAppDecorator.render(BaseWebAppDecorator.java:39) at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:84) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70) at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:327) at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126) at org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:195) at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:159) at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:141) at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:90) at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:417) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 

此时,您的请求的Authentication对象是AnonymousAuthenticationToken类的实例,该类没有名为displayName的属性。

显然,SpringSecurity认为用户未被记录。 你可能需要

  • 更改访问规则,以便只能在用户登录时查看该JSP,或者

  • 将JSP更改为类似以下内容(假设您使用的是Spring 3.0.x并且已启用Web安全表达式)。


      

参考文献:

  • 基于表达的访问控制
  • JSP标记库

接下来是斯蒂芬C的回答和他给出的参考文献

我成功编写了我的代码As

    

其中,ROLE_DEFINED_1和ROLE_DEFINED_2是您的应用程序中定义的角色。