我正在开发一个基于Java、JSP、Struts2和Waffle的Web应用程序,以保证安全性。我在Tomcat6中运行它,我的问题是我不能在我的ActionSupport类中获得一个主体对象。更具体地说,
principalProxy.getUserPrincipal()始终返回null。但是,当我将其放入.jsp文件中时:
request.getUserPrincipal()这不会返回null。因此,该信息必须在原始HttpServletRequest对象中可用。当然,我也尝试过对ActionSupport类中的HttpServletRequest对象调用getUserPrincipal(),但这也返回了null。
我的ActionSupport类被定义为
public class SomeAction extends ActionSupport
implements ServletRequestAware, ServletResponseAware, PrincipalAware {
...这是我的struts.xml (缩写):
<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匹配的筛选器映射。以下是相关部分:
<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中请求的设置。再简单不过了。
@Override
public void setServletRequest(HttpServletRequest request) {
httpRequest = request;
}实例变量httpRequest的类型为HttpServletRequest。
发布于 2012-03-05 20:01:27
我仍然无法从HTTPServletRequest获取用户主体对象。但是,我能够从会话中获得一个主体对象:
private String getLoggedInUser() {
if (httpSession.containsKey(WAFFLE_PRINCIPAL_KEY)) {
WindowsPrincipal principal =
(WindowsPrincipal) httpSession.get(WAFFLE_PRINCIPAL_KEY);
return principal == null ? "" : principal.getName();
} else {
return "";
}
}会话密钥定义为:
private static final String WAFFLE_PRINCIPAL_KEY =
"waffle.servlet.NegotiateSecurityFilter.PRINCIPAL";尽管如此,我还是很想知道原始问题的答案。
https://stackoverflow.com/questions/9496523
复制相似问题