2013-05-20 3 views
1

У меня есть Liferay-Hook до ovrrideAuthenticateByEmailAddress(...) метод.Liferay Hook - получить IP-журнал пользователя в

Я хочу, чтобы IP-адрес пользователя регистрировался и ограничил доступ на нем.

Как я могу получить IP-адрес пользователя в этом методе?
Я использую ServiceBuilder для создания портлетов.
Я работаю Tomcat.

ответ

3

Просто подумайте, но если вы хотите ограничить использование IP-адресов, а не делать это в своем приложении, вы можете сделать это на веб-сервере, который развертывает ваше приложение.

Например, в Tomcat вы можете установить ограничения безопасности в свой web.xml.

restrict access by ip это тоже можно сделать в JBoss, это действительно зависит от того, какой веб-сервер вы используете, но это похоже на самое простое решение, а не на использование фильтра в вашем приложении.

EDIT: после комментариев ниже, просто сделайте PortalUtil.getHttpServletRequest(request).getRemoteAddr(); в методе, который вы переопределяете, и поместите свою бизнес-логику там, чтобы увидеть, изменился ли пользователь ip (сравните этот IP с сохраненным и т. Д.). Liferay уже имеет некоторые из этих функций here

+0

Я хочу создать пользовательское поле «IP» для пользователей и установить его для каждого пользователя. Когда пользователь попытается войти в систему, я проверю удаленный IP-адрес. Если он был равен пользовательскому IP-адресу пользователя, он регистрируется в противном случае при возникновении ошибки. – Hamid62

+0

А я вижу, поэтому, если пользователь изменяет IP, вы можете сообщить им, что они входят в систему из другого места? – david99world

+0

Да. Теперь, как я могу это сделать? – Hamid62

0

Я полагаю, что эти классы созданы Service Builder. Тогда вы можете просто использовать:

String user = request.getRemoteUser();//take current logged in user ID 
int userId = Integer.valueOf(user);//convert it into integer 
User newUser = UserLocalServiceUtil.getUser(userId);//get the Liferay user using the user ID you get in the line above 
userIp=newUser.getLoginIP();//after you have the current user take his LoginIP with the get method that Liferay has already 

В базе Liferay у вас есть таблица с именем user_ там Liferay хранит все виды информации о своих пользователях. Используя UserLocalServiceUtil, вы можете взять эту информацию и использовать ее по своему усмотрению.

Я надеюсь, что это было полезно. Удачи вам в вашем портале :)

+0

Так как этот класс является крючком в цепочке аутентификации, этот ответ прост. –

5

Вот что сработало для меня в Liferay 6.0.6.

В моем приложении я также изменил default login.jsp. Это было фактически по умолчанию login.jsp с двумя дополнительными вещами. Во-первых, получить IP-адрес из запроса:

<%String ip = PortalUtil.getHttpServletRequest(renderRequest).getRemoteAddr();%> 

и добавить дополнительный параметр:

<portlet:actionURL secure="<%= PropsValues.COMPANY_SECURITY_AUTH_REQUIRES_HTTPS || request.isSecure() %>" var="loginURL"> 
      <portlet:param name="saveLastPath" value="0" /> 
      <portlet:param name="struts_action" value="/login/login" /> 
      <portlet:param name="requestIp" value="<%= ip %>" /> 
     </portlet:actionURL> 

Теперь в вашем перекрываться AuthenticateByEmailAddress(), вы можете получить его от parameterMap:

String ip = parameterMap.get("requestIp")[0]; 
+0

Это единственный рабочий ответ до сих пор - но не очень удовлетворительный, поскольку его не очень изящное решение. –

0

В Liferay Portal, у меня есть правильный IP-адрес клиента следующим образом.

FacesContext facesContext = FacesContext.getCurrentInstance(); 
PortletRequest portletRequest = (PortletRequest) facesContext.getExternalContext().getRequest(); 
HttpServletRequest request = PortalUtil.getHttpServletRequest(portletRequest); 
HttpServletRequest originalServletRequest = PortalUtil.getOriginalServletRequest(request); 
String ipAddress=originalServletRequest.getHeader("x-forwarded-for"); 
+0

для меня нет возможности получить там FacesContext. –

0

Поскольку только один ответ сработал, и я был не очень доволен этим решением, я сделал немного больше копания.

Вот что я придумал:

Создать новый фильтр и зарегистрировать его в 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 
Смежные вопросы