首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Struts 2+ Waffle:用户主体始终为空

Struts 2+ Waffle:用户主体始终为空
EN

Stack Overflow用户
提问于 2012-02-29 17:28:23
回答 1查看 2.5K关注 0票数 3

我正在开发一个基于Java、JSP、Struts2和Waffle的Web应用程序,以保证安全性。我在Tomcat6中运行它,我的问题是我不能在我的ActionSupport类中获得一个主体对象。更具体地说,

代码语言:javascript
复制
principalProxy.getUserPrincipal()

始终返回null。但是,当我将其放入.jsp文件中时:

代码语言:javascript
复制
request.getUserPrincipal()

这不会返回null。因此,该信息必须在原始HttpServletRequest对象中可用。当然,我也尝试过对ActionSupport类中的HttpServletRequest对象调用getUserPrincipal(),但这也返回了null。

我的ActionSupport类被定义为

代码语言:javascript
复制
public class SomeAction extends ActionSupport 
  implements ServletRequestAware, ServletResponseAware, PrincipalAware {
  ...

这是我的struts.xml (缩写):

代码语言:javascript
复制
<package name="default" namespace="/" extends="struts-default">
  <action name="some" class="com.my.package.SomeAction">
    <interceptor-ref name="servlet-config" />
    <interceptor-ref name="params">
      <param name="excludeParams ">(.*)</param>
    </interceptor-ref>
    <interceptor-ref name="i18n"/>
    <result name="success">/someresult.jsp</result>
  </action>
</package>

web.xml定义了一个安全筛选器和一个应该与任何URL匹配的筛选器映射。以下是相关部分:

代码语言:javascript
复制
<filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>

<filter>
  <filter-name>SecurityFilter</filter-name>
  <filter-class>waffle.servlet.NegotiateSecurityFilter</filter-class>   
  <init-param>
    <param-name>principalFormat</param-name>
    <param-value>fqn</param-value>
  </init-param>
  <init-param>
    <param-name>roleFormat</param-name>
    <param-value>both</param-value>
  </init-param>
  <init-param>
    <param-name>allowGuestLogin</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>securityFilterProviders</param-name>
    <param-value>
      waffle.servlet.spi.BasicSecurityFilterProvider
      waffle.servlet.spi.NegotiateSecurityFilterProvider
    </param-value>
  </init-param>
  <init-param>
    <param-name>waffle.servlet.spi.NegotiateSecurityFilterProvider/protocols</param-name>
    <param-value>
      Negotiate
      NTLM
    </param-value>
  </init-param>
  <init-param>    
    <param-name>waffle.servlet.spi.BasicSecurityFilterProvider/realm</param-name>
    <param-value>WaffleFilterDemo</param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>FORWARD</dispatcher>
  <dispatcher>REQUEST</dispatcher>         
</filter-mapping>

<filter-mapping>
  <filter-name>SecurityFilter</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>FORWARD</dispatcher>
  <dispatcher>REQUEST</dispatcher>      
</filter-mapping>

当请求SomeAction时,系统会根据需要提示我使用HTTP Basic Authentication对话框。这表明SecurityFilter确实得到了应用,不是吗?setPrincipalProxy()方法也会被调用。我可以在JSP页面中获得一个Principal对象。那么,为什么当我尝试在SomeAction中访问主体对象时,它总是为空呢?

还有一件事,我正在使用URL重写,以防这可能与它有关。

编辑:响应于batbaatar的请求,Java中请求的设置。再简单不过了。

代码语言:javascript
复制
@Override
public void setServletRequest(HttpServletRequest request) {
  httpRequest = request;
}

实例变量httpRequest的类型为HttpServletRequest。

EN

回答 1

Stack Overflow用户

发布于 2012-03-05 20:01:27

我仍然无法从HTTPServletRequest获取用户主体对象。但是,我能够从会话中获得一个主体对象:

代码语言:javascript
复制
private String getLoggedInUser() {
  if (httpSession.containsKey(WAFFLE_PRINCIPAL_KEY)) {
    WindowsPrincipal principal = 
      (WindowsPrincipal) httpSession.get(WAFFLE_PRINCIPAL_KEY);
    return principal == null ? "" : principal.getName();
  } else {
    return "";
  }
}

会话密钥定义为:

代码语言:javascript
复制
private static final String WAFFLE_PRINCIPAL_KEY = 
    "waffle.servlet.NegotiateSecurityFilter.PRINCIPAL";

尽管如此,我还是很想知道原始问题的答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9496523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档