java - 将用户授权移出 Liferay

标签 java security liferay keycloak

任何人都可以分享一些如何从 Liferay 中完全删除用户身份验证和授权的想法吗?背后的想法是转移所有用户管理并将此责任交给其他一些身份提供商,例如 Keycloak。我目前正在努力了解 Liferay 如何根据其数据库对用户进行身份验证。

我有一个扩展 Action 类的类,以及单击登录公式中的提交按钮时触发的 run 方法

public class CustomTemplateVarsAction extends Action { 
@Override
public void run(HttpServletRequest request, HttpServletResponse httpServletResponse) throws ActionException {
    ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
    User user = themeDisplay.getUser();

如何制作整个机制,它将重定向到永恒的提供者(Keycloak 或 WSO2)并让用户在那里输入用户名和密码,并且仅在成功的情况下捕获 JWT token 并允许用户登录我的门户?

任何想法都非常受欢迎。

最佳答案

去年我已经通过 Open ID Connect 协议(protocol)为 Liferay 7 和 Keycloak 实现了这一点。该方法利用已记录的 Liferay 7 插件点。

  • com.liferay.portal.kernel.security.auto.login.AutoLogin
  • com.liferay.portal.kernel.servlet.LiferayFilter

实际上是扩展抽象类

  • com.liferay.portal.kernel.security.auto.login.BaseAutoLogin
  • com.liferay.portal.kernel.servlet.BaseFilter
  • com.liferay.portal.kernel.events.Action

它拦截对 Liferay 的所有请求,并将登录重定向到 IdP(即 Keycloak),然后通过根据 Keycloak 验证传入的访问 token (反向 channel 调用)来处理传入的访问 token 。对于有效的访问 token ,它通过从访问 token 中提取用户的数据,将经过身份验证的用户的数据导入(或更新)到 Liferay 的数据库中。这还包括角色和组织关联!
另一个挑战是 token 刷新(这也使 Keycloak session 保持 Activity 状态)和支持参与全局注销 (GLO)。因此,Liferay 端需要另一个过滤器,用于识别特殊的 Keycloak 注销请求并终止相应的 Liferay session 。

此外,从 Liferay 内部使用 REST 客户端(调用 Keycloak API 需要)可能会很棘手。 JAX-RS 客户端的 OSGi 捆绑不完整,并且由于类加载器问题只能由自定义 ClientBuilder 工厂修复。但如果你直接使用 Jersey 或 RestEasy 而不使用 JAX-RS,可能就不那么痛苦了。

说实话。以专业、稳定、安全的方式实现这一切需要几个月的时间。特别是如果您必须对 Liferay 代码进行大量研究。对于此类工作的文档是不够的。
github 上有两个开源项目正在解决这个主题。

但是,oxRay 似乎不再维护,并且不支持 Liferay 7(需要 OSGi)。
另一个在去年年初还太不成熟,但现在可能已经有所进步了。

关于java - 将用户授权移出 Liferay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48034103/

相关文章:

java - 无法解析 google place JSON 响应 - org.json.JSONException

java - 最好的 Java SIP 堆栈是什么?

java - 根据从字符串解析的日期对 ArrayList<String> 进行排序

security - AWS S3 中预签名 URL 的安全性如何?

java - 我如何创建一个递归的 Anagram 工具来打印一串字母的所有可能组合,包括前缀?

java - Android Screencast 失败(请帮助新的 Android Dev)

java - 签署 jar 文件需要什么?

java - 在liferay hook中将自定义类导入到JSP

permissions - 检查用户是否有查看页面的权限

java - 如何在liferay 6.2中显示二级drop dwon菜单?