繁体   English   中英

Liferay Hook-获取用户IP登录

[英]Liferay Hook - Get the User IP logging in

我有一个Liferay-Hook可以ovrride AuthenticateByEmailAddress(...)方法。

我想获取正在登录的用户的IP地址,并基于它来限制访问。

如何通过这种方法获取用户IP?
我使用ServiceBuilder制作portlet。
我在Tomcat上工作。

这是在Liferay 6.0.6中对我有用的东西。

我还改变了默认的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];

只是想一想,但是如果您想基于IP进行限制,而不是在应用程序中进行限制,则可以在正在部署应用程序的Web服务器中进行限制。

例如,在Tomcat中,您可以将安全性约束放在web.xml中。

通过ip限制访问也可以在JBoss中完成,这实际上取决于您使用的Web服务器,但这似乎是最简单的解决方案,而不是在应用程序中进行过滤。

编辑:在下面的评论之后,只需执行PortalUtil.getHttpServletRequest(request).getRemoteAddr(); 在您要覆盖的方法中,将您的业务逻辑放在此处,以查看用户是否更改了ip(将此IP与保留的IP进行比较,等等)。 Liferay 在这里已经具有一些此功能

我想这些类是由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您可以获取此信息并根据需要使用它。

我希望这会有所帮助。 祝您的门户网站好运:)

在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");

由于只有一个答案有效,而且我对该解决方案并不满意,因此我做了一些深入的研究。

这是我想出的:

创建一个新的过滤器并将其注册到您的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM