GateIn: фильтр для сервлета входа

Мне нужно реализовать некоторую логику до и после сервлета входа, вызванного моим login.jsp.

Поэтому я написал фильтр для URL / логина, чтобы сделать это. Мне нужно получить профиль пользователя для некоторых операций, поэтому я создал этот класс LoginFilter:

public class LoginFilter implements Filter {
    private static Logger logger = Logger.getLogger(LoginFilter.class);

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String username = httpRequest.getParameter("username");
        String password = httpRequest.getParameter("password");

        chain.doFilter(request, response);

        PortalRequestContext context = PortalRequestContext.getCurrentInstance();

        if (context == null)
            logger.info("PortalRequestContext is NULL");
        else {
            String userId = context.getRemoteUser();

            if (userId == null || userId.equals(""))
                logger.info("Login failed, IP:" + httpRequest.getRemoteAddr());
            else
                logger.info("Login executed, username:" + userId);
        }
    }

Проблема в том, что "context" (PortalRequestContext) всегда равен нулю. Что я делаю не так? Это правильный подход?

5 ответов

Если вы используете GateIn, вы можете попробовать использовать

org.exoplatform.portal.webui.util.Util.getPortalRequestContext().getRequest()

в.п.

Вы можете разработать Valve и добавить его в файл контекста веб-приложения "portal" (Tomcat/conf/Catalina/localhost/portal.xml). Вот что сделано в GateIN для расширения SSO, например: См. ServletAccessValve

ServletAccess.setRequestAndResponse(request, response);

Затем запрос доступен в SSOLoginModule с помощью этого:

// Tomcat way (Assumed that ServletAccessValve has been configured in context.xml)
  else
  {
     request = ServletAccess.getRequest();
  }

Для JBoss это более просто, вы просто должны использовать

javax.security.jacc.PolicyContext.getContext(HttpServletRequest.class.getName())

Вы можете добавить фильтр GateIN, как описано здесь.

И вы можете использовать статически в этом фильтре ConversationState для получения текущего имени пользователя:

ConversationState.getCurrent().getIdentity().getUserId();

Во время входа в систему, PortalRequestContextеще не был создан, но вы можете получить удаленного пользователя, позвонив HttpServletRequest#getRemoteUser()

Просто используйте объект состояния разговора:

// Gets the current user id
ConversationState conversationState = ConversationState.getCurrent();

org.exoplatform.services.security.Identity identity = conversationState.getIdentity();
String userId = identity.getUserId();
Другие вопросы по тегам