在没有密码的情况下登录Liferay用户

我需要通过对外部系统进行身份验证来在Liferay中登录用户。 不过,我仍然需要有一个有效的Liferay会话。 所以,我需要通过登录到Liferay

  • 询问用户的用户名/密码
  • 使用它们对外部系统进行身份验证。
  • 只使用用户名(而不是密码)对Liferay登录进行身份验证。
  • 如果外部系统登录成功,请将用户登录。
  • 我做了几件事情:

  • 自动登录
  • 挂钩到UserLocalService.authenticateByScreenName覆盖
  • auth.pipeline pre和check = false
  • LoginFilter。
  • 这些都不起作用。 这是对这些方法的解释。 这个想法是包含/ /调用外部系统进行身份验证将包括如果这些方法的工作。 请纠正我犯错的地方,如果某种方法比其他方法更好。

    1.自动登录:

    一个。 设置portal-ext.properties

     auto.login.hooks=com.poc.AutoLoginFil
    

    湾 创建一个班级

    public class AutoLoginFilter implements AutoLogin {
    
        public AutoLoginFilter() {
            super();
        }
    
        @Override
        public String[] login(HttpServletRequest req, HttpServletResponse arg1) throws AutoLoginException {
    
    //Call external system to authenticate 
            User user =  UserLocalServiceUtil.getUserByScreenName(company.getCompanyId(), login);
             credentials[0] = String.valueOf(user.getUserId());
    
            credentials[1] = "undefined";
            credentials[2] = Boolean.TRUE.toString();
    
                return credentials;
        }
    }
    

    C。 部署插件项目,重新启动服务器并转至http:// localhost:8080 / web / guest / home。 这应该以joebloggs身份登录

    这没有奏效

    2.挂钩到UserLocalService.authenticateByScreenName覆盖

    一个。 在liferay-hook.xml中

    <service>
            <service-type>
                com.liferay.portal.service.UserLocalService
            </service-type>
            <service-impl>
                com.test.UserService
            </service-impl>
        </service>
    

    湾 扩展UserLocalServiceWrapper并使用自定义类。

    public class UserService  extends  UserLocalServiceWrapper
    {
    
    @Override
        public int authenticateByScreenName(long companyId, String screenName, String password, Map headerMap, Map parameterMap, Map resultsMap)
        {
    //Call external system to authenticate 
            String name = "";
            log.info(screenName);
            return SUCCESS;
        }
    
    }
    

    当我登录时,它应该使用任何密码。 它不是。

    3. auth.pipeline pre和check = false

    一个。 在portal-ext.properties中

    auth.pipeline.enable.liferay.check=false
    auth.pipeline.pre=com.test.AutoLoginCustom
    

    湾 然后,进入

    public class AutoLoginCustom implements AutoLogin
    {
    
    @Override
    public String[] login(HttpServletRequest arg0, HttpServletResponse arg1)
                throws AutoLoginException {
    
    @Override
        public String[] login(HttpServletRequest arg0, HttpServletResponse arg1)
    {
    //Call external system to authenticate 
      credentials[0] = "joebloggs";
    
            credentials[1] = "undefined";
            credentials[2] = Boolean.TRUE.toString();
    
                return credentials;
    }
    

    C。 部署项目并重新启动服务器。 转到http:// localhost:8080 / web / guest / home。 使用用户名和不同的密码登录。 它不会登录。 它甚至没有打到AutoLoginCustom java中的调试点。

    4. LoginFilter在liferay-hook.xml中,

    <servlet-filter>
            <servlet-filter-name>Login</servlet-filter-name>
            <servlet-filter-impl>com.test.AutoLoginFilter</servlet-filter-impl>
        </servlet-filter>
    

    在AutoLoginFilter中

    public class AutoLoginFil implements Filter
    {
    
        @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1,
                FilterChain arg2) throws IOException, ServletException {
    
    //Call external system to authenticate 
            log.debug("doFilter");
    
        }
    }
    

    调试过滤器不被调用。

    在这些方法中是否存在错误?如果是,它是什么?是否有不同的方法来做到这一点? 我已经看过以下参考文献。

    如何在liferay中使用自动登录?

    Liferay - AutoLogin + Authenticator - 从请求头获取凭证


    我做了一些更多的游戏,我能够找到解决这个问题的方法。

    答案是
    2.挂钩到UserLocalService.authenticateByScreenName覆盖

    步骤1:

    <service>
            <service-type>
                com.liferay.portal.service.UserLocalService
            </service-type>
            <service-impl>
                com.test.UserService
            </service-impl>
        </service>
    

    第2步:

    扩展UserLocalServiceWrapper并使用自定义类。

    public class UserService  extends  UserLocalServiceWrapper
    {
    
    @Override
        public int authenticateByScreenName(long companyId, String screenName, String password, Map headerMap, Map parameterMap, Map resultsMap)
        {
    //Call external system to authenticate 
    
            if(externalAuthenticationSuccess)
            {
              return Authenticator.SUCCESS;
           }
           else
           {
             return Authenticator.FAILURE; 
           } 
    
    }
    

    这在部署时起作用。

    当我发布该问题时这不起作用,因为:

  • 我在服务器上安装了Tomcat。 我在做这个改变之前部署了这个项目。
  • 一旦我做了更新,我使用了Liferay插件,并使用右键单击项目 - > Liferay-> deploy进行部署。
  • 我在代码中使用断点来查看它是否会在登录时捕获它。
  • 这没有被捕获,因为我使用的Eclipse IDE需要通过服务器下的ReDeploy部署的项目,而不是Liferay插件命令。
  • 当我使用Eclipse Tomcat服务器进行部署时,它捕获了断点。

    答案

  • auth.pipeline pre和check = false

    在portal-ext.properties中

    auth.pipeline.enable.liferay.check = false auth.pipeline.pre = com.test.CustomAuthenticator

    public class CustomAuthenticator implements Authenticator
    {
        @Override
        public int authenticateByScreenName(long companyId, String screenName, String password,
                Map<String, String[]> headerMap, Map<String, String[]> parameterMap) throws AuthException {
    
    
    
        //Call external system to authenticate 
        if(externalAuthenticationSuccess)
        {
            return Authenticator.SUCCESS;
        }
        else
        {
            return Authenticator.FAILURE; 
        } 
    
    
        }
    }
    
  • 这也适用,但它只能在JBoss中使用,而不能在Tomcat中使用。 我在中部署了portal-ext.properties

    TOMCAT_HOME 的webapps ROOT WEB-INF 班

    在JBoss EAP中,它位于Liferay_Home下。 它可能没有拿起Tomcat的财产,但在JBoss中。

    问题中发布的其他可能的解决方案也可能工作,但我没有探索一切,以找到配置中的错误。

    如果对这些解决方案有任何意见或问题,请发布,我会很乐意提供进一步的步骤。 谢谢。

    链接地址: http://www.djcxy.com/p/60163.html

    上一篇: Logging in Liferay user without password

    下一篇: NTLM SSO and LDAP