为什么在装饰器中调用安全认证属性`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是您的应用程序中定义的角色。