Struts 2 + Waffle: принципал пользователя всегда нулевой - PullRequest
3 голосов
/ 29 февраля 2012

Я работаю над веб-приложением на основе Java, JSP, Struts 2 и Waffle для обеспечения безопасности.Я запускаю его в Tomcat 6. Моя проблема в том, что я не могу получить главный объект в своем классе ActionSupport.Чтобы быть более конкретным,

principalProxy.getUserPrincipal()

всегда возвращает ноль.Однако когда я помещаю это в файл .jsp:

request.getUserPrincipal()

, это не возвращает ноль.Таким образом, информация должна быть доступна в исходном объекте HttpServletRequest.Конечно, я пытался вызвать getUserPrincipal () для объекта HttpServletRequest в классе ActionSupport, но это также возвращает ноль.

Мой класс ActionSupport определен как

public class SomeAction extends ActionSupport 
  implements ServletRequestAware, ServletResponseAware, PrincipalAware {
  ...

Кроме того, мои распорки.xml определяет действие с набором перехватчиков servlet-config, поэтому метод setPrincipalProxy () действительно вызывается (проверяется операторами print).Это мой 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 () также вызывается.Я могу получить объект Principal на странице JSP.Так почему объект Principal всегда пуст, когда я пытаюсь получить к нему доступ в SomeAction?

Еще одна вещь, я использую перезапись URL-адреса, на случай, если это может иметь какое-либо отношение к нему.

РЕДАКТИРОВАТЬ: В ответ на запрос batbaatar, настройка запроса в Java.Не может быть намного проще.

@Override
public void setServletRequest(HttpServletRequest request) {
  httpRequest = request;
}

Переменная экземпляра httpRequest имеет тип HttpServletRequest.

1 Ответ

1 голос
/ 05 марта 2012

Я все еще не смог получить объект основного пользователя из 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";

Тем не менее, любопытно получить ответ на первоначальный вопрос.

...