Java 如何在liferay中使用autologin?

Java 如何在liferay中使用autologin?,java,liferay,autologin,Java,Liferay,Autologin,我想从我们的应用程序中自动登录我的用户。我知道liferay有一个自动登录功能,但我不知道如何使用它。我在网上没有找到多少有价值的信息。 我需要做什么才能让autologin工作 我想在用户单击链接时自动登录,而无需输入用户名和密码。名称和密码保存在我们的应用程序数据库中 你说的“autologin”到底是什么意思?如果您想让Liferay检查用户是否已通过某个外部实体(如作为CAS的单点登录服务器)的身份验证,您可以在中启用该功能。它已经为liferay支持的身份验证机制进行了预配置。否则,您

我想从我们的应用程序中自动登录我的用户。我知道liferay有一个自动登录功能,但我不知道如何使用它。我在网上没有找到多少有价值的信息。 我需要做什么才能让autologin工作


我想在用户单击链接时自动登录,而无需输入用户名和密码。名称和密码保存在我们的应用程序数据库中

你说的“autologin”到底是什么意思?如果您想让Liferay检查用户是否已通过某个外部实体(如作为CAS的单点登录服务器)的身份验证,您可以在中启用该功能。它已经为liferay支持的身份验证机制进行了预配置。否则,您可能需要实现自己的autologin钩子(如中所示,例如,Well found it)。 步骤1:单击AddiFrame,让配置视图弹出。 步骤2:提供url,如果存在任何变量,如(www.mysite.com/Action=Login&User…),请在隐藏变量文本字段中添加Action=Login。 第3步:单击“身份验证”并选择“基于表单的身份验证”。在此过程中,请确保正确提供了用户字段名和密码字段名,并且值将为“@screen_name@”,“@password@”

例如,假设url类似于www.mysite.com/Action=Login?User=aj&Password=aj。 用户名(字段)=用户 密码(字段)=密码 用户名(值)=aj 密码(值)=aj 隐藏变量(字段)=操作=登录

现在,每当任何用户登录liferay应用程序时,如果他/她的帐户存在于指定的站点(url中),它将自动登录该站点(就像单一登录一样)

这是工作!!!
-Aj

我认为OP现在没有答案了。尽管如此,这应该得到一个全面的答案。事实上,我很惊讶它还没有答案

首先,这是一个坏主意:OP提出的这种安排真的太不安全了。然而,对于为Liferay创建autologin的人来说,所描述问题的解决方案可能是一个很好的原型

现在,让我们假设您希望自动登录在查询字符串参数中发送其屏幕名称的任何用户http://localhost:8080/web/guest/home?insecurely_login_user=juju然后应该登录
juju
用户中的Liferay。如何操作?请按照以下步骤操作:

创建autologin类 首先,创建一个钩子插件。在其
docroot/WEB-INF/src
目录中,创建一个实现
com.liferay.portal.security.auth.AutoLogin
接口的类。在我的示例中,我将其称为
br.brandizzi.adam.liferay.unsecure.unsecureautologin

AutoLogin
接口只有一个方法,称为
login()
,该方法需要两个参数(一个
HttpServletRequest
和一个
HttpServletResponse
实例)并返回一个字符串数组。因此,我的类在没有实现的情况下如下所示:

public class InsecureAutoLogin implements AutoLogin {

    @Override
    public String[] login(HttpServletRequest request,
            HttpServletResponse response) throws AutoLoginException {
        // TODO Auto-generated method stub
        return null;
    }

}
AutoLogin.login()
方法将尝试从多个来源(主要是请求对象)检索身份验证所需的信息。如果它决定用户应该登录,它将返回一个包含相关数据的数组进行身份验证;如果它决定不让用户登录,它可以返回
null

在本例中,我们尝试从请求中的
不安全登录\u user
参数中获取用户名。如果有这样的参数,我们将继续登录;如果没有这样的参数,它只返回
null

String screenName = request.getParameter("insecurely_login_user");
if (screenName == null || screenName.isEmpty()) {
    return null;
}
try {
    long companyId = PortalUtil.getCompanyId(request);
    User user = UserLocalServiceUtil.getUserByScreenName(companyId,
            screenName);
    return new String[] { String.valueOf(user.getUserId()),
            user.getPassword(),
            String.valueOf(user.isPasswordEncrypted()) };
} catch (Exception e) {
    return null;
}
我们有了这个屏幕名。现在该怎么办?让我们从数据库中获取一个具有相同屏幕名的用户

long companyId = PortalUtil.getCompanyId(request);
User user = UserLocalServiceUtil.getUserByScreenName(companyId,
        screenName);
如果存在这样一个屏幕名的用户,则将检索该用户并将其归因于
user
变量。在这种情况下,身份验证应成功,autologin类应返回一个包含三个字符串的数组-凭据。这些值将作为凭据返回,并按其在数组中的显示顺序排列:

  • 以字符串形式显示用户id
  • 用户的密码,可以加密也可以不加密
  • 一个布尔值,强制转换为字符串,指示密码是否加密
这是一句话:

return new String[] {
    String.valueOf(user.getUserId()),
    user.getPassword(),
    String.valueOf(user.isPasswordEncrypted())
};
但是,如果找不到用户,将引发异常。因此,我们必须用
try
/
catch
构造来包围上面的代码。如果引发异常,只需返回
null

String screenName = request.getParameter("insecurely_login_user");
if (screenName == null || screenName.isEmpty()) {
    return null;
}
try {
    long companyId = PortalUtil.getCompanyId(request);
    User user = UserLocalServiceUtil.getUserByScreenName(companyId,
            screenName);
    return new String[] { String.valueOf(user.getUserId()),
            user.getPassword(),
            String.valueOf(user.isPasswordEncrypted()) };
} catch (Exception e) {
    return null;
}
最后,这是我的
unsecureAutoLogin
类:

public class InsecureAutoLogin implements AutoLogin {
    public String[] login(HttpServletRequest request,
            HttpServletResponse response) throws AutoLoginException {

        String screenName = request.getParameter("insecurely_login_user");
        if (screenName == null || screenName.isEmpty())
            return null;

        try {
            long companyId = PortalUtil.getCompanyId(request);
            User user = UserLocalServiceUtil.getUserByScreenName(companyId,
                    screenName);
            return new String[] { String.valueOf(user.getUserId()),
                    user.getPassword(),
                    String.valueOf(user.isPasswordEncrypted()) };
        } catch (Exception e) {
            return null;
        }

    }
}
注册autologin类 现在我们的钩子应该将这个类注册为autologin处理器。这真的很容易

首先,编辑文件
docroot/WEB-INF/liferay hook.xml
添加值为
portal.properties
portal properties
元素:

<?xml version="1.0"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.1.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_1_0.dtd">

<hook>
    <portal-properties>portal.properties</portal-properties>
</hook>
就是这样。部署这个钩子,你的自动登录就可以了

结论 正如我所说,你不应该使用这种不安全的“身份验证”方法。绕过它太容易了,甚至可以获得管理权限!但是,如果你按照这些步骤操作,你就有了创建更好的autologin功能的框架。此外,我知道有些人真的想做类似这种不安全的“身份验证”的事情方法,有时我们不得不暂停我们的判断,只是帮助一个人射击自己的脚


可以找到该项目的源代码,您可以下载WAR。

步骤1:创建一个CustomLoginFilter类并从AutoLogin接口实现。覆盖登录方法。代码如下

public String[] login(HttpServletRequest req, HttpServletResponse response)throws AutoLoginException {

//Get the login parameter

String loginEmailId = ParamUtil.getString(req, “_58_login”);

String password = req.getParameter(“_58_password”);

String[] credentials = new String[3];

credentials[0] = userId

credentials[1] = loginEmailId;

credentials[2] = password;

//Write your business logic Here and return String[].

}
步骤2:在portal-ext.properties中编写以下代码

// you get full control from this custom class.

auto.login.hooks=com.bolog.portal.login.security.CustomLoginFilter

//Override Liferay Authentication pipeline

auth.pipeline.enable.liferay.check=false

auth.pipeline.pre=com.bolog.portal.login.security.CustomLoginAuthenticator
步骤3:创建CustomLoginAuthenticator类并从Authenticator实现

Override  authentication methods.

public int authenticateByEmailAddress(long arg0, String arg1, String arg2,

Map<String, String[]> arg3, Map<String, String[]> arg4)

throws AuthException {

//Write Your business login here and if authentication success then return 1 otherwise return 0;

return 0;

}

public int authenticateByScreenName(long arg0, String arg1, String arg2,

Map<String, String[]> arg3, Map<String, String[]> arg4)
throws AuthException {

//Write Your business login here and if authentication success then return 1 otherwise return 0;
return 0;
}

public int authenticateByUserId(long arg0, long arg1, String arg2,
Map<String, String[]> arg3, Map<String, String[]> arg4)
throws AuthException {

//Write Your business login here and if authentication success then return 1 otherwise return 0;
return 0;
}

我想在用户单击链接时自动登录,而不必输入名称和密码。名称和密码保存在我们的应用程序数据库中