【发布时间】:2024-05-21 06:35:02
【问题描述】:
我需要通过对外部系统进行身份验证来登录 Liferay 中的用户。但是,我仍然需要有一个有效的 Liferay 会话。所以,我需要通过
登录 Liferay- 向用户询问用户名/密码
- 使用它们对外部系统进行身份验证。
- 仅使用用户名(而不是密码)对 Liferay 登录进行身份验证。
- 如果外部系统登录成功,则登录用户。
我做了几件事:
- 自动登录
- 挂钩到 UserLocalService.authenticateByScreenName 覆盖
- auth.pipeline pre 和 check = false
- 登录过滤器。
这些都不起作用。以下是对这些方法的解释。这个想法是包括 //如果这些方法有效,将包括调用外部系统进行身份验证。 请纠正我犯错的地方,以及某些方法是否比其他方法更好。
1.自动登录:
一个。设置portal-ext.properties
auto.login.hooks=com.poc.AutoLoginFil
b.创建一个类
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>
b.扩展 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
b.然后,在
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.登录过滤器 在 liferay-hook.xml 中,
<servlet-filter>
<servlet-filter-name>Login</servlet-filter-name>
<servlet-filter-impl>com.test.AutoLoginFilter</servlet-filter-impl>
</servlet-filter>
在自动登录过滤器中
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
【问题讨论】:
标签: java authentication login liferay hook