簡體   English   中英

如何在 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獲取令牌有效但不使用實際類。

Liferay 通過 OSGi 實現模塊化的美妙之處在於,您可以訪問為您的訪問而設計的所有內容(例如導出),而沒有明確未導出的內容。 Impl結尾的類通常屬於非導出類。

您仍然可以創建訪問權限,但您會明確地知道您正在超越已發布的 API,並且您讓自己依賴於實現。 猜猜誰也在改變實施,而不照顧其他人? 上游項目。 Liferay 的開發人員正在努力保持 API 的穩定,但改變他們的實現是他們的職責。

如果您決定需要訪問實現:不客氣,打開這些模塊。 請注意,未來的每一次(次要)升級都可能會改變您所依賴的實現的一個方面。 您願意為未來接受高維護負擔。 對於某些功能,這很好,您可能願意為此付出代價。 其他功能可能無法證明這個價格是合理的。 做出明智的選擇。

這個問題沒有通用的答案,只有一堆經驗法則:

  • 重新表述問題,尋找替代解決方案。 有時,從長遠來看,第一次拍攝需要更長時間的解決方案更容易維護
  • 使業務利益相關者可以看到侵入性更改的成本。 我看到許多功能請求在標有價格標簽后消失或發生了顯着變化
  • 沿 API 搜索替代實現
  • 向 Liferay 開發人員描述您的(業務)問題(而不是解決方案):他們將來可能會引入一個擴展點,以便您可以在下一個版本中使用基於 API 的模塊替換對模塊實現的侵入性更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM