Fórum

Manejo de Perfiles como en Netflix

thumbnail
Jonatan Oyola, modificado 9 Anos atrás.

Manejo de Perfiles como en Netflix

Regular Member Postagens: 193 Data de Entrada: 06/06/07 Postagens Recentes
Hola.

Estoy desarrollando un portal educativo en donde un mayor de edad va a registrar un usuario, y la idea es que vaya creando distintos perfiles para cada uno de los integrantes de la familia (cada perfil va a ser un usuario de liferay incluido como miembro del sitio creado por el usuario principal). El problema es que los miembros mas chichitos de la familia no van a tener mails, y entonces surgio la idea de utilizar un mecanismo similar al utilizando en Netflix de crear distintos perfiles por cada usuario. Para esto, utilice la funcion de IMPERSONATE para simular a un usuario cuando estoy registrado con otro, pero esto no funciona cuando comienzo a navegar en las paginas del sitio porque pierde el parametro doAsUserId que permite esta simulacion. Con lo cual esto no funciona como lo esperabamos.

Entonces estuve probando distintas alternativas para hacer un cambio de login entre usuarios.

  • Alternativa 1


view.jsp

<%  for(User u : userList) {  %>
	<li>
		<liferay-portlet:actionurl var="changeProfileUrl">
			<liferay-portlet:param name="<%= ActionRequest.ACTION_NAME %>" value="ChangeProfile" />
		</liferay-portlet:actionurl>

		<a href="<%= changeProfileUrl %>">
			<img src="<%= HtmlUtil.escape(u.getPortraitURL(themeDisplay)) %>" alt="<%= user.getFullName() %>" width="60" heigth="60">
			<span>&lt;%= HtmlUtil.escape(u.getFullName()) %&gt;</span>
		</a>
	</li>
&lt;% } %&gt;

ChangeProfileActionCommand.java

public class ChangeProfileActionCommand implements ActionCommand {

	private static Log _LOG = LogFactoryUtil.getLog(ChangeProfileActionCommand.class);

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.liferay.util.bridges.mvc.ActionCommand#processCommand(javax.portlet
	 * .PortletRequest, javax.portlet.PortletResponse)
	 */
	@Override
	public boolean processCommand(PortletRequest portletRequest, PortletResponse portletResponse) throws PortletException {

		try {
			ActionRequest actionRequest = (ActionRequest) portletRequest;
			ActionResponse actionResponse = (ActionResponse) portletResponse;
			doProcessCommand(actionRequest, actionResponse);
		} catch (Exception e) {
			if (_LOG.isErrorEnabled()) {
				_LOG.error(e.getMessage(), e);
			}
		}

		return false;
	}

	public void doProcessCommand(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception {
		HttpServletRequest request = PortalUtil.getHttpServletRequest(actionRequest);
		HttpServletResponse response = PortalUtil.getHttpServletResponse(actionResponse);

		MethodKey methodKey = new MethodKey("com.liferay.portlet.login.util.LoginUtil", "login", HttpServletRequest.class, HttpServletResponse.class, String.class, String.class, boolean.class, String.class);
		PortalClassInvoker.invoke(false, methodKey, request, response, "joyola@valkitek.com", "test", false, null);
	}
}


No hace nada. Sigue autenticado con el mismo usuario con el que entre.

  • Alternativa 2


portal-ext.properties

auto.login.hooks=com.liferay.portal.security.auth.ParameterAutoLogin,...


ChangeProfileActionCommand.java

public class ChangeProfileActionCommand implements ActionCommand {

	private static Log _LOG = LogFactoryUtil.getLog(ChangeProfileActionCommand.class);

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.liferay.util.bridges.mvc.ActionCommand#processCommand(javax.portlet
	 * .PortletRequest, javax.portlet.PortletResponse)
	 */
	@Override
	public boolean processCommand(PortletRequest portletRequest, PortletResponse portletResponse) throws PortletException {

		try {
			ActionRequest actionRequest = (ActionRequest) portletRequest;
			ActionResponse actionResponse = (ActionResponse) portletResponse;
			doProcessCommand(actionRequest, actionResponse);
		} catch (Exception e) {
			if (_LOG.isErrorEnabled()) {
				_LOG.error(e.getMessage(), e);
			}
		}

		return false;
	}

	public void doProcessCommand(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception {
		ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY);

		String url = themeDisplay.getPortalURL();
		url = HttpUtil.addParameter(url, "parameterAutoLoginLogin", "joyola@valkitek.com");
		url = HttpUtil.addParameter(url, "parameterAutoLoginPassword", "test");

		actionResponse.sendRedirect(HttpUtil.addParameter(themeDisplay.getURLSignOut(), "referer", url));
	}
}


Simplemente se desloguea, y no redirecciona a la url que envio.

Si no hay un usuario logueado. el autologin con parametros funciona correctamente.

  • Alternativa 3


ChangeProfileActionCommand.java

	public void doProcessCommand(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception {
		try {
			HttpSession session = request.getSession();

			EventsProcessorUtil.process(
				PropsKeys.LOGOUT_EVENTS_PRE, PropsValues.LOGOUT_EVENTS_PRE,
				request, response);

			String domain = CookieKeys.getDomain(request);

			Cookie companyIdCookie = new Cookie(
				CookieKeys.COMPANY_ID, StringPool.BLANK);

			if (Validator.isNotNull(domain)) {
				companyIdCookie.setDomain(domain);
			}

			companyIdCookie.setMaxAge(0);
			companyIdCookie.setPath(StringPool.SLASH);

			Cookie idCookie = new Cookie(CookieKeys.ID, StringPool.BLANK);

			if (Validator.isNotNull(domain)) {
				idCookie.setDomain(domain);
			}

			idCookie.setMaxAge(0);
			idCookie.setPath(StringPool.SLASH);

			Cookie passwordCookie = new Cookie(
				CookieKeys.PASSWORD, StringPool.BLANK);

			if (Validator.isNotNull(domain)) {
				passwordCookie.setDomain(domain);
			}

			passwordCookie.setMaxAge(0);
			passwordCookie.setPath(StringPool.SLASH);

			boolean rememberMe = GetterUtil.getBoolean(
				CookieKeys.getCookie(request, CookieKeys.REMEMBER_ME));

			if (!rememberMe) {
				Cookie loginCookie = new Cookie(
					CookieKeys.LOGIN, StringPool.BLANK);

				if (Validator.isNotNull(domain)) {
					loginCookie.setDomain(domain);
				}

				loginCookie.setMaxAge(0);
				loginCookie.setPath(StringPool.SLASH);

				CookieKeys.addCookie(request, response, loginCookie);
			}

			Cookie rememberMeCookie = new Cookie(
				CookieKeys.REMEMBER_ME, StringPool.BLANK);

			if (Validator.isNotNull(domain)) {
				rememberMeCookie.setDomain(domain);
			}

			rememberMeCookie.setMaxAge(0);
			rememberMeCookie.setPath(StringPool.SLASH);

			CookieKeys.addCookie(request, response, companyIdCookie);
			CookieKeys.addCookie(request, response, idCookie);
			CookieKeys.addCookie(request, response, passwordCookie);
			CookieKeys.addCookie(request, response, rememberMeCookie);

			try {
				session.invalidate();
			}
			catch (Exception e) {
			}

			EventsProcessorUtil.process(
				PropsKeys.LOGOUT_EVENTS_POST, PropsValues.LOGOUT_EVENTS_POST,
				request, response);

			request.setAttribute(WebKeys.LOGOUT, true);

		}
		catch (Exception e) {
			PortalUtil.sendError(e, request, response);

			return null;
		}
		
		ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY);

		String url = themeDisplay.getPortalURL();
		url = HttpUtil.addParameter(url, "parameterAutoLoginLogin", "joyola@valkitek.com");
		url = HttpUtil.addParameter(url, "parameterAutoLoginPassword", "test");

		actionResponse.sendRedirect(url);
	}


No hace nada. Sigue autenticado con el mismo usuario.

Alguna idea? Sugerencia? Que puedo hacer?

Gracias!!!!