10

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

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

4

4 回答 4

42

我相信OP现在没有答案了。尽管如此,这值得一个全面的答案。事实上,我很惊讶它还没有。

首先,这是一个坏主意:OP提出的这种安排确实太不安全了。尽管如此,对于为 Liferay 创建自动登录的人来说,所描述问题的解决方案可能是一个很好的原型。

现在,假设您要自动登录其屏幕名称在查询字符串参数中发送的任何用户。例如,如果有一次访问,http://localhost:8080/web/guest/home?insecurely_login_user=juju那么用户中的 Liferayjuju应该已登录。如何做到这一点?请按照以下步骤操作:

创建自动登录类

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

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.

在我们的例子中,我们尝试insecurely_login_user从请求的参数中获取用户名。如果有这样的参数,我们将继续登录;如果没有这样的参数,它只会返回null

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

所以我们有了网名。现在要做什么?让我们从数据库中获取一个具有相同屏幕名称的用户。

long companyId = PortalUtil.getCompanyId(request);
User user = UserLocalServiceUtil.getUserByScreenName(companyId,
        screenName);

如果存在具有这样一个屏幕名称的用户,它将被检索并归因于该user变量。在这种情况下,身份验证应该成功,并且自动登录类应该返回一个由三个字符串组成的数组——凭据。这些是要作为凭据返回的值,按照它们应该出现在数组中的顺序:

  • 用户 ID 作为字符串
  • 用户的密码,可以加密也可以不加密;
  • 一个布尔值,转换为字符串,指示密码是否已加密。

所以这是行:

return new String[] {
    String.valueOf(user.getUserId()),
    user.getPassword(),
    String.valueOf(user.isPasswordEncrypted())
};

但是,如果找不到用户,则会引发异常。所以,我们必须用try/catch结构包围上面的代码。如果抛出异常,只需返回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;
}

最后,这是我的InsecureAutoLogin课:

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;
        }

    }
}

注册自动登录类

现在我们的钩子应该将这个类注册为一个自动登录处理器。这真的很容易。

首先,编辑文件,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>

现在,创建一个名为portal.properties. docroot/WEB-INF/src它应该包含一个名为的属性auto.login.hooks,其值应该是我们类的名称:

auto.login.hooks=br.brandizzi.adam.liferay.insecure.InsecureAutoLogin

就是这样。部署这个钩子,你的自动登录就可以工作了。

结论

正如我所说,您不应该使用这种不安全的“身份验证”方法。绕过它太容易了,甚至获得管理权限!但是,如果您遵循这些步骤,您就有了一个框架来创建更好的自动登录功能。另外,我知道有些人真的很想做这种不安全的“身份验证”方法,有时我们不得不暂停我们的判断,只是帮助一个人开枪……

这个项目的源代码可以在这里找到,你可以在这里下载 WAR 。

于 2013-02-21T17:24:56.527 回答
2

步骤 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;
}

第 4 步:如果身份验证失败,您还可以通过以下代码重定向任何页面

if(Validator.isNull(credentials) || credentials[0]==null){

req.setAttribute(AutoLogin.AUTO_LOGIN_REDIRECT, “Your Login page path”);

}
于 2014-11-03T11:24:52.337 回答
1

“自动登录”到底是什么意思?如果您希望 Liferay 检查用户是否已通过某些外部实体(例如作为 CAS 的单点登录服务器)的身份验证,您可以在portal.properties中启用它。那里已经为 liferay 支持的身份验证机制进行了预配置。否则,您可能需要实现自己的自动登录挂钩(例如,如本文所示

于 2011-07-22T08:56:08.020 回答
0

好找到了。第 1 步:点击添加 iframe 并弹出配置视图。第 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

于 2011-10-19T12:28:06.613 回答