【问题标题】:How to land users to different page as per their roles如何根据用户的角色将用户登陆到不同的页面
【发布时间】:2015-06-15 17:20:30
【问题描述】:

我正在使用 Liferay 并希望在用户登录后显示不同的登录页面:如果门户网站的管理员尝试登录,他将登录到页面 A,如果访客登录到门户网站,他将登录到页面B. @Today15 我已经做到了..

    package com.landing.page.pagetwo;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.events.Action;
import com.liferay.portal.kernel.events.ActionException;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.struts.LastPath;
import com.liferay.portal.kernel.util.PrefsPropsUtil;
import com.liferay.portal.kernel.util.PropsKeys;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.Group;
import com.liferay.portal.model.User;
import com.liferay.portal.service.GroupLocalServiceUtil;
import com.liferay.portal.util.PortalUtil;

public class LandingPage extends Action {

@Override
public void run(HttpServletRequest httpsreq, HttpServletResponse httpsres)
              throws ActionException {
    try {
        doRun(httpsreq, httpsres);
    }
    catch (Exception e) {
        throw new ActionException(e);
    }
}
protected void doRun(
        HttpServletRequest request, HttpServletResponse response)
        throws Exception {

        long companyId = PortalUtil.getCompanyId(request);

        String path =
            PrefsPropsUtil.getString(
                companyId, PropsKeys.DEFAULT_LANDING_PAGE_PATH);

        if (_log.isInfoEnabled()) {
            _log.info(PropsKeys.DEFAULT_LANDING_PAGE_PATH + StringPool.EQUAL +
                path);
        }

        if (Validator.isNull(path)) {
            path = getCustomLandingPage(request);
        }

        HttpSession session = request.getSession();
        session.setAttribute(WebKeys.LAST_PATH, new LastPath(
            StringPool.BLANK, path));

    }
private String getCustomLandingPage(HttpServletRequest request)
        throws PortalException, SystemException {

        String customLandingPagePath = StringPool.BLANK;


        customLandingPagePath = getSitePath(PortalUtil.getUser(request), false);

        return customLandingPagePath;
    }
    private String getSitePath(User user, boolean includeLanguage)
            throws PortalException, SystemException {

            String sitePath = StringPool.BLANK;
            List<Group> userSites = getSites(user.getUserId());

            String language = StringPool.BLANK;

            if (includeLanguage) {
                language = StringPool.SLASH + user.getLocale().getLanguage();
            }

            if ((userSites != null) && !userSites.isEmpty()) {
                String siteFriendlyURL = userSites.get(0).getFriendlyURL();
                sitePath = language + "/group" + siteFriendlyURL + "/pagetwo";
            }

            return sitePath;
        }
    private List<Group> getSites(long userId)
            throws PortalException, SystemException {

            List<Group> sites = new ArrayList<Group>();

            for (Group group : GroupLocalServiceUtil.getUserGroups(userId)) {
                if (group.isRegularSite() &&
                    !"Guest".equalsIgnoreCase(group.getName())) {
                    sites.add(group);
                    break;
                }
            }
            return sites;
        }

        private static Log _log =
            LogFactoryUtil.getLog(LandingPage.class);
}

现在我可以登陆我网站的自定义页面。但是如何限制其他用户从该页面登陆,以及如何将他们登陆到其他页面。

【问题讨论】:

    标签: liferay


    【解决方案1】:

    首先: 在登录之前,所有用户都是访客。每个经过身份验证的用户都将拥有“用户”角色。所以你必须检查用户是否是管理员。话虽如此,我会采取这种方法: 例如,为角色创建一个自定义字段并将其命名为landingPage。 创建一个 PostLoginHook。

    package com.liferay.sample.hook;
    import com.liferay.portal.kernel.events.Action;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class LoginAction extends Action {
        public void run(HttpServletRequest req, HttpServletResponse res) {
            System.out.println("## My custom login action");
        }
    }
    

    在运行方法中,您检查landingPage 自定义字段的值,然后相应地设置lastPath 属性。比如这样的:

    Map params = new HashMap();  
    
    params.put("p_l_id", new String[] {"PRI.1.1"});
    
    LastPath lastPath = new LastPath("/c", "/portal/layout", params);
    
    session.setAttribute(WebKeys.LAST_PATH, lastPath);
    

    您可能还想看看 Liferay 本身的 DefaultLandingPageAction 类: https://github.com/liferay/liferay-portal/blob/master/portal-impl/src/com/liferay/portal/events/DefaultLandingPageAction.java

    我建议使用自定义字段,这样您就可以随时更改登录页面。另一个优势是,您也可以对其他角色执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      相关资源
      最近更新 更多