Поскольку только один ответ сработал, и я был не очень доволен этим решением, я сделал немного больше копания.
Вот что я придумал:
Создать новый фильтр и зарегистрировать его в Liferay. Там вы храните запрос в потоке локально и удаляете его в конце запроса.
Впоследствии вы можете просто получить запрос от фильтра.
RequestFilter.java
@WebFilter(urlPatterns = "/*")
public class RequestFilter implements Filter {
private static final ThreadLocal<HttpServletRequest> REQUEST = new ThreadLocal<>();
public static HttpServletRequest getRequest() {
HttpServletRequest req = REQUEST.get();
if (req == null) {
throw new IllegalStateException("Attempt to fetch thread-local request outside of filter chain");
}
return req;
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
REQUEST.set((HttpServletRequest)req);
try {
chain.doFilter(req, res);
} finally {
REQUEST.remove();
}
}
@Override
public void destroy() {
}
}
MyAuthFailure.java
public class MyAuthFailure implements AuthFailure {
private static final Log LOG = LogFactoryUtil.getLog(MyAuthFailure.class);
@Override
public void onFailureByEmailAddress(long companyId, String emailAddress,
Map<String, String[]> headers, Map<String, String[]> params) throws AuthException {
logFailure(companyId, emailAddress);
}
@Override
public void onFailureByScreenName(long companyId, String screenName,
Map<String, String[]> headers, Map<String, String[]> params) throws AuthException {
logFailure(companyId, screenName);
}
@Override
public void onFailureByUserId(long companyId, long userId,
Map<String, String[]> headers, Map<String, String[]> params) throws AuthException {
logFailure(companyId, userId);
}
protected void logFailure(String user) {
String ip = RequestFilter.getRequest().getRemoteAddr();
LOG.error("User " + user + " tried to login from IP " + ip);
}
}
Liferay-hook.xml
<?xml version="1.0"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd">
<hook>
<portal-properties>portal.properties</portal-properties>
<custom-jsp-dir>/WEB-INF/jsp</custom-jsp-dir>
<servlet-filter>
<servlet-filter-name>requestFilter</servlet-filter-name>
<servlet-filter-impl>com.stackoverflow.RequestFilter</servlet-filter-impl>
</servlet-filter>
</hook>
portal.properties
auth.failure=com.stackoverflow.MyAuthFailure
Я хочу создать пользовательское поле «IP» для пользователей и установить его для каждого пользователя. Когда пользователь попытается войти в систему, я проверю удаленный IP-адрес. Если он был равен пользовательскому IP-адресу пользователя, он регистрируется в противном случае при возникновении ошибки. – Hamid62
А я вижу, поэтому, если пользователь изменяет IP, вы можете сообщить им, что они входят в систему из другого места? – david99world
Да. Теперь, как я могу это сделать? – Hamid62