我需要通过对外部系统进行身份验证来登录Liferay中的用户。但是,我仍然需要有一个有效的Liferay会话。所以,我需要通过
登录Liferay我做了一些事情:
这些都行不通。以下是对这些方法的解释。这个想法包括 //如果这些方法有效,将包括调用外部系统进行身份验证。 请更正我犯错误的地方,以及某些方法与其他方法相比更好。
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
答案 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;
}
}
这在部署时有效。
当我发布问题时,这不起作用,因为:
当我使用Eclipse Tomcat Server进行部署时,它捕获了断点。
答案
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;
}
}
}
这也有效,但它只适用于JBoss,而不适用于Tomcat。我在
中部署了portal-ext.propertiesTOMCAT_HOME \ web应用\ ROOT \ WEB-INF \类
在JBoss EAP中,它位于Liferay_Home下。它可能没有在Tomcat中获取该属性,但在JBoss中获得了。
问题中发布的其他可能解决方案也可能有效,但我没有探索一切以找到配置中的错误。
如果对这些解决方案有任何意见或疑问,请发布,我将很乐意提供进一步的措施。谢谢。