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

时间:2016-02-17 21:37:31

标签: java authentication login liferay hook

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

登录Liferay
  1. 向用户询问用户名/密码
  2. 使用它们对外部系统进行身份验证。
  3. 仅使用用户名(而不是密码)对Liferay登录进行身份验证。
  4. 如果外部系统登录成功,请将用户登录。
  5. 我做了一些事情:

    1. 自动登录
    2. 挂钩到UserLocalService.authenticateByScreenName覆盖
    3. auth.pipeline pre和check = false
    4. LoginFilter。
    5. 这些都行不通。以下是对这些方法的解释。这个想法包括 //如果这些方法有效,将包括调用外部系统进行身份验证。 请更正我犯错误的地方,以及某些方法与其他方法相比更好。

      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;
          }
      }
      

      ℃。部署插件项目,重新启动服务器并转到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;
      }
      

      ℃。部署项目并重新启动服务器。转到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");
      
          }
      }
      

      未调用调试过滤器。

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

      How do I use autologin in liferay?

      Liferay - AutoLogin + Authenticator - Get Credentials From Request Header

1 个答案:

答案 0 :(得分:2)

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

答案 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; 
       } 

}

这在部署时有效。

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

  1. 我在服务器中安装了Tomcat。我在进行此更改之前部署了项目。
  2. 完成更新后,我使用Liferay插件并使用右键单击项目进行部署 - &gt; Liferay-&GT;部署。
  3. 我在代码中使用断点来查看它是否会在登录期间捕获它。
  4. 这没有被捕获,因为我使用的Eclipse IDE需要通过Server下的ReDeploy部署的项目而不是Liferay Plugin命令。
  5. 当我使用Eclipse Tomcat Server进行部署时,它捕获了断点。

    答案

    1. auth.pipeline pre和check = false

      在portal-ext.properties

      auth.pipeline.enable.liferay.check =假 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; 
          } 
      
      
          }
      }
      
    2. 这也有效,但它只适用于JBoss,而不适用于Tomcat。我在

      中部署了portal-ext.properties

      TOMCAT_HOME \ web应用\ ROOT \ WEB-INF \类

      在JBoss EAP中,它位于Liferay_Home下。它可能没有在Tomcat中获取该属性,但在JBoss中获得了。

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

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