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();