Как я могу использовать аутологин в LifeRay? - PullRequest
10 голосов
/ 22 июля 2011

Я хочу авторизовать своих пользователей автоматически из нашего приложения.Я знаю, что у Liferay есть функция автоматического входа, но я не знаю, как ее использовать.Я не нашел много ценной информации в Интернете.Что мне нужно сделать, чтобы заставить работать автологин?

Я хочу автоматически входить в систему, когда пользователь нажимает на ссылку, без необходимости ввода имени и пароля.Имя и пароль сохраняются в нашей базе данных приложения.

Ответы [ 4 ]

40 голосов
/ 21 февраля 2013

Я полагаю, что ОП сейчас бесполезен для ответа. Тем не менее, это заслуживает исчерпывающего ответа. На самом деле, я удивлен, что у него его еще нет.

Прежде всего, это плохая идея: такая договоренность, как предложенная ФП, действительно слишком небезопасна. Тем не менее, решение описанной проблемы может стать хорошим прототипом для тех, кто создает аутологин для Liferay.

Теперь, допустим, вы хотите автоматически войти в систему любого пользователя, чье имя отображается в параметре строки запроса. Например, если у вас один доступ http://localhost:8080/web/guest/home?insecurely_login_user=juju, то в систему должен войти Liferay пользователя juju. Как это сделать? Выполните следующие действия:

Создать класс автологина

Во-первых, создайте подключаемый модуль. В своем каталоге 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. В этом случае аутентификация должна быть успешной, и класс autologin должен возвращать массив из трех строк - учетные данные . Это значения, которые должны быть возвращены в качестве учетных данных, в порядке их появления в массиве:

  • идентификатор пользователя в виде строки
  • пароль пользователя, который может быть зашифрован или нет;
  • логическое значение, приведенное к строке, указывающее, зашифрован ли пароль.

Итак, вот строка:

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 здесь .

2 голосов
/ 03 ноября 2014

Шаг 1. Создайте класс CustomLoginFilter и реализует его из интерфейса AutoLogin. Метод входа в систему Override. Код следующий.

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”);

}
1 голос
/ 22 июля 2011

Что именно вы подразумеваете под "аутологином"? Если вы хотите, чтобы Liferay проверил, аутентифицирован ли пользователь какой-либо внешней сущностью (например, сервером единой регистрации как CAS), вы можете просто включить это в portal.properties . Там он уже предварительно настроен для механизмов аутентификации, поддерживаемых liferay. В противном случае вам может потребоваться реализовать собственный хук autologin (как указано в в этом посте , например

0 голосов
/ 19 октября 2011

Хорошо нашел это.Шаг 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), он будет автоматически входить на этот сайт (действует как единый вход).

Это работает !!!-Л

...