如何在 portlet 中使用 Liferay 内部代码?

How to work with Liferay internal code in portlets?

之前我问了一个关于如何访问由 liferays 内部 OIDC 进程设置的会话数据的问题。最后,我使用 java 反射访问了令牌,但我无法相信这是正确的或唯一的方法。

我添加了以下依赖项,希望我能够直接使用 OpenIdConnectSessionImpl,但这样我就无法将 portlet 添加到我的 liferay。

compileOnly 'com.liferay:com.liferay.portal.security.sso.openid.connect.impl'
compileOnly group: 'com.nimbusds', name: 'oauth2-oidc-sdk', version: '5.17.1'

这是我使用的代码:

Object oidcSession = httpSession.getAttribute("OPEN_ID_CONNECT_SESSION");

if (oidcSession instanceof OpenIdConnectSessionImpl) {
  OpenIdConnectSessionImpl openIdConnectSessionImpl = (OpenIdConnectSessionImpl) oidcSession;

  LOG.info(openIdConnectSessionImpl.getUserInfo().toJSONObject().toString(new JSONStyle(4)));
} else {
  LOG.info("What is this.");
}

使用反射从 oidcSession 获取令牌有效但不使用实际的 Class。

Liferay 通过 OSGi 模块化的美妙之处在于,您可以访问为您的访问而设计的所有内容(例如导出),而没有明确未导出的内容。 类 以 Impl 结尾通常属于未导出的 类。

您仍然可以创建访问权限,但您会明确知道您将远远超出已发布的 API,并且您使自己依赖于实现。猜猜谁也在更改实施,而不考虑其他人?上游项目。 Liferay 的开发人员正在努力保持 API 稳定,但更改其实现是他们的工作。

如果您决定需要访问实现:不客气,打开这些模块。请注意,未来的每一次(次要)升级都可能会改变您所依赖的实现的一个方面。您愿意为未来承担高昂的维护负担。对于某些功能,这很好,您可能愿意为此付出代价。其他功能可能无法证明这个价格。明智地选择。

这个问题没有通用的答案,只有一些经验法则:

  • 重新表述问题,以寻找替代解决方案。有时,一个解决方案在第一次拍摄时需要更长的时间,但在长期 运行
  • 中维护起来要容易得多
  • 让业务利益相关者看到侵入性变更的成本。我看到许多功能请求在有价格标签时消失或发生重大变化
  • 沿着 API
  • 搜索替代实现
  • 向 Liferay 开发人员描述您的(业务)问题(不是解决方案):他们可能会在未来引入扩展点,这样您就可以用 API 替换模块实现的侵入性更改下一版本中的基于模块。