Fórum
Manejo de Perfiles como en Netflix
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.
view.jsp
ChangeProfileActionCommand.java
No hace nada. Sigue autenticado con el mismo usuario con el que entre.
portal-ext.properties
ChangeProfileActionCommand.java
Simplemente se desloguea, y no redirecciona a la url que envio.
Si no hay un usuario logueado. el autologin con parametros funciona correctamente.
ChangeProfileActionCommand.java
No hace nada. Sigue autenticado con el mismo usuario.
Alguna idea? Sugerencia? Que puedo hacer?
Gracias!!!!
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><%= HtmlUtil.escape(u.getFullName()) %></span>
</a>
</li>
<% } %>
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!!!!