/o//commerce-media/accounts/-1/images/30454912?download=false

Liferay CE Portal Security SSO NTLM
30454881
描述

NTLM (NT LAN Manager) is a suite of Microsoft protocols that provide authentication, integrity, and confidentiality for users. Though Microsoft has adopted Kerberos in modern versions of Windows server, NTLM is still used when authenticating to a workgroup. @product@ supports NTLM v2 authentication. NTLM v2 is more secure and has a stronger authentication process than NTLMv1.
Note: NTLM authentication is deprecated in Liferay 7.1 and may be removed in future versions. Users should migrate to Kerberos.

NTLM (NT LAN Manager) is a suite of Microsoft protocols that provide authentication, integrity, and confidentiality for users. Though Microsoft has adopted Kerberos in modern versions of Windows server, NTLM is still used when authenticating to a workgroup. @product@ supports NTLM v2 authentication. NTLM v2 is more secure and has a stronger authentication process than NTLMv1.
Note: NTLM authentication is deprecated in Liferay 7.1 and may be removed in future versions. Users should migrate to Kerberos.

DEVELOPER
处理模板时发生错误。
The following has evaluated to null or missing:
==> sku.skuOptions  [in template "3192443#3192485#null" at line 122, column 32]

----
Tip: It's the step after the last dot that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #list sku.skuOptions as opt  [in template "3192443#3192485#null" at line 122, column 25]
	~ Reached through: #nested  [in template "3192443#3192485#null" in macro "section" at line 246, column 17]
	~ Reached through: @section title=languageUtil.get(local...  [in template "3192443#3192485#null" at line 107, column 1]
----
1<#assign 
2	channel = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels?accountId=-1&filter=name eq 'Marketplace Channel' and siteGroupId eq '${themeDisplay.getScopeGroupId()}'") 
3 
4	product = restClient.get( 
5		"/headless-commerce-delivery-catalog/v1.0/channels/" + channel.items[0].id + 
6		"/products/" + CPDefinition_cProductId.getData() + 
7		"?accountId=-1&nestedFields=categories,productSpecifications,skus&skus.accountId=-1&skus.currencyCode=USD" 
8
9 
10	catalogName = product.catalogName!"" 
11	categories = product.categories![] 
12	createDate = product.createDate!0 
13	productSpecifications = product.productSpecifications![] 
14 
15	liferayVersions = productSpecifications?filter(item -> stringUtil.equals(item.specificationKey, "liferay-version")) 
16	platformOffering = categories?filter(item -> stringUtil.equals(item.vocabulary?replace(" ", "-"), "marketplace-liferay-platform-offering")) 
17
18 
19<#assign 
20	publisherDetailsResponse = restClient.get("/c/publisherdetailses?filter=publisherName eq '${catalogName}'") 
21	redirectPath = "https://marketplace.liferay.com/e/publisher-details/29282497" 
22/> 
23 
24<#if publisherDetailsResponse.items?has_content> 
25	<#assign 
26		publisherDetails = publisherDetailsResponse.items[0] 
27		profileImageURL = publisherDetails.publisherProfileImage?replace("https://", "http://") 
28	/> 
29</#if> 
30 
31<#assign 
32	appDocumentationURL = getSpecificationValue("appdocumentationurl") 
33	appInstallationGuideURL = getSpecificationValue("appinstallationguideurl") 
34	appUsageTerms = getSpecificationValue("appusagetermsurl") 
35	cpuValue = getSpecificationValue("cpu") 
36	developerName = getSpecificationValue("developer-name", catalogName) 
37	publisherURL = (getSpecificationValue("publisherwebsiteurl")?trim?replace(" ", ""))!"" 
38	ramValue = getSpecificationValue("ram") 
39	sourceCode = getSpecificationValue("source-code-url") 
40	supportEmail = getSpecificationValue("supportemailaddress") 
41	supportPhone = getSpecificationValue("supportphone") 
42	type = getSpecificationValue("type")?lower_case 
43
44<@section title = languageUtil.get(locale, "developer")> 
45	<#if publisherDetails?has_content> 
46		<a class = "bg-neutral-8" href = "${redirectPath}/${publisherDetails.id}"> 
47			${developerName} 
48		</a> 
49	<#else> 
50		<a class = "bg-neutral-8" href = "/?developer-name=${developerName}"> 
51			${developerName} 
52		</a> 
53	</#if> 
54</@section> 
55 
56<@section title = languageUtil.get(locale, "publisher-date", "Publisher Date")> 
57	<#if createDate?has_content> 
58		<#assign parsedDate = createDate?datetime("yyyy-MM-dd'T'HH:mm:ss'Z'") /> 
59 
60		<p>${parsedDate?string("MMMM d, yyyy")}</p> 
61	</#if> 
62</@section> 
63 
64<@section title = languageUtil.get(locale, "deployment-method", "Deployment Method")> 
65	<#list platformOffering as offering> 
66		<p>${offering.name}</p> 
67	</#list> 
68</@section> 
69 
70<@section title = languageUtil.get(locale, "app-type", "App Type")> 
71	<#if type == 'client-extension'> Client Extension </#if> 
72	<#if type == 'cloud'> Cloud </#if> 
73	<#if type == 'composite-app'> Composite App </#if> 
74	<#if type == 'dxp'> DXP </#if> 
75	<#if type == 'low-code-configuration'> Low Code Configuration </#if> 
76</@section> 
77 
78<@section title = languageUtil.get(locale, "version")> 
79	${getSpecificationValue("latest-version", "1.0.0")} 
80</@section> 
81 
82<#if liferayVersions?has_content> 
83	<@section title = languageUtil.get(locale, "supported-versions", "Supported Versions")> 
84		<#list liferayVersions as version> 
85			${version.value}<#if version?has_next>, </#if> 
86		</#list> 
87	</@section> 
88</#if> 
89 
90<#if cpuValue?has_content> 
91	<@section title = languageUtil.get(locale, "resource-requirements", "Resource Requirements")> 
92		<p> 
93			<#if cpuValue?has_content> 
94				${cpuValue} 
95				<#assign cpuNumber = cpuValue?number?default(0) /> 
96				<#if cpuValue?eval gt 1> 
97					CPUS 
98				</#if> 
99				<#if cpuValue?eval lt 2> 
100					CPU 
101				</#if> 
102			</#if>, <#if ramValue?has_content>${ramValue} GB RAM</#if> 
103		</p> 
104	</@section> 
105</#if> 
106 
107<@section title = languageUtil.get(locale, "standard-price", "Standard Price")> 
108	<div> 
109		<#assign purchasableSkus = [] /> 
110 
111		<#list product.skus as sku> 
112			<#if sku.purchasable?? && sku.purchasable> 
113				<#assign purchasableSkus = purchasableSkus + [sku] /> 
114			</#if> 
115		</#list> 
116 
117		<#assign standardSku = {} /> 
118 
119		<#list purchasableSkus as sku> 
120			<#assign matched = false /> 
121 
122			<#list sku.skuOptions as opt> 
123				<#if stringUtil.equals(opt.skuOptionValueKey, "standard")> 
124					<#assign 
125						matched = true 
126						standardSku = sku 
127					/> 
128 
129					<#break> 
130				</#if> 
131			</#list> 
132			<#if matched><#break></#if> 
133		</#list> 
134 
135		<#if standardSku.price?? && standardSku.price.price?eval gt 0> 
136			<div class="bg-neutral-8">${standardSku.price.priceFormatted!""}</div> 
137		<#else> 
138			${languageUtil.get(locale, "free", "Free")} 
139		</#if> 
140	</div> 
141</@section> 
142 
143<@section title = languageUtil.get(locale, "help-and-support", "Help and Support")> 
144	<div class="d-flex flex-column mt-4"> 
145		<#if (appDocumentationURL?has_content || appInstallationGuideURL?has_content)> 
146			<div class="d-flex mb-4"> 
147				<span class="help-and-support-modal-icon" id="installation-documentation"> 
148					<@clay["icon"] symbol="document" /> 
149				</span> 
150 
151				<a class="d-flex w-100 justify-content-between help-and-support-modal" href="javascript:void(0)" onClick="openInstallationDocsModal()"> 
152					<span class="copy-text ml-1 help-and-support-modal"> 
153						${languageUtil.get(locale, "installation-documentation", "Installation Documentation")} 
154					</span> 
155 
156					<@clay["icon"] 
157						className="help-and-support-modal-arrow link-arrow ml-auto" 
158						height="12" 
159						symbol="angle-right-small" 
160					/> 
161				</a> 
162			</div> 
163		</#if> 
164 
165		<div class="d-flex mb-4"> 
166			<span class="help-and-support-modal-icon" id="publisher-support"> 
167				<@clay["icon"] symbol="envelope-closed" /> 
168			</span> 
169 
170			<a class="d-flex w-100 justify-content-between help-and-support-modal" href="javascript:void(0)" onClick="openPublisherSupportModal()"> 
171				<span class="copy-text ml-1 help-and-support-modal"> 
172					${languageUtil.get(locale, "publisher-support", "Publisher Support")} 
173				</span> 
174 
175				<@clay["icon"] 
176					className="help-and-support-modal-arrow link-arrow ml-auto" 
177					height="12" 
178					symbol="angle-right-small" 
179				/> 
180			</a> 
181		</div> 
182 
183		<#if sourceCode?has_content> 
184			<div class="d-flex mb-4"> 
185				<span class="help-and-support-link-icon"> 
186					<@clay["icon"] symbol="code" /> 
187				</span> 
188 
189				<a 
190					class="d-flex font-weight-semi-bold help-and-support-link justify-content-between w-100" 
191					href="${sourceCode}" 
192					target="_blank"> 
193					<span class="copy-text ml-1 help-and-support-link"> 
194						${languageUtil.get(locale, "source-code", "Source Code")} 
195					</span> 
196				</a> 
197			</div> 
198		</#if> 
199 
200		<div class="d-flex"> 
201			<span class="help-and-support-link-icon"> 
202				<@clay["icon"] symbol="check-square" /> 
203			</span> 
204 
205			<a 
206				class="d-flex font-weight-semi-bold help-and-support-link justify-content-between w-100" 
207				href="${(appUsageTerms?has_content)?then(appUsageTerms, 'https://marketplace.liferay.com/license-agreement')}" 
208				target="_blank"> 
209 
210				<span class="copy-text ml-1 help-and-support-link"> 
211					${languageUtil.get(locale, "eula", "EULA")} 
212				</span> 
213			</a> 
214		</div> 
215	</div> 
216</@section> 
217 
218<@section 
219	showLine = false 
220	title = languageUtil.get(locale, "share-link") 
221
222	<a class="align-items-center copy-text d-flex font-weight-bold ml-1 text-primary" href="#copy-share-link" onclick="copyToClipboard(Liferay.ThemeDisplay.getCanonicalURL())"> 
223		<span class="help-and-support-link-icon mr-1"> 
224			<@clay["icon"] symbol="link" /> 
225		</span> 
226		Copy & Share 
227	</a> 
228</@section> 
229 
230<#function getSpecificationValue key default=""> 
231	<#local spec = productSpecifications?filter(productSpecification -> 
232		stringUtil.equals(productSpecification.specificationKey, key)) /> 
233 
234	<#return (spec?first.value)!default /> 
235</#function> 
236 
237<#macro section 
238	title 
239	showLine=true 
240
241	<p> 
242		<strong>${title}</strong> 
243	</p> 
244 
245	<div> 
246		<#nested> 
247	</div> 
248 
249	<#if showLine> 
250		<hr /> 
251	</#if> 
252</#macro> 
253 
254<script ${nonceAttribute}> 
255	function installationDocsModalBody() { 
256		return ` 
257			<#if appDocumentationURL?has_content> 
258				<div class="d-flex flex-row align-items-center mb-3"> 
259					<span class="align-items-center d-flex justify-content-center modal-icon-background mr-3" style="background: #E2E2E4; border-radius:50%; height:40px; overflow:hidden; width:40px;"> 
260						<@clay["icon"] 
261							style="fill:#6B6C7E;" 
262							symbol="document-code" 
263						/> 
264					</span> 
265 
266					<div class="d-flex flex-column"> 
267						<span class="text-black-50">${languageUtil.get(locale, "app-documentation-url", "App Documentation URL")}</span> 
268 
269						<a class="font-weight-bold" href="tel:${appDocumentationURL}" target="_blank"> 
270							${appDocumentationURL} 
271						</a> 
272					</div> 
273				</div> 
274			</#if> 
275 
276			<#if appInstallationGuideURL?has_content> 
277				<div class="d-flex flex-row align-items-center mb-4"> 
278					<span class="align-items-center d-flex justify-content-center modal-icon-background mr-3" style="background: #E2E2E4; border-radius:50%; height:40px; overflow:hidden; width:40px;"> 
279						<@clay["icon"] 
280							style="fill:#6B6C7E;" 
281							symbol="document" 
282						/> 
283					</span> 
284 
285					<div class="d-flex flex-column"> 
286						<span class="text-black-50">${languageUtil.get(locale, "app-installation-guide-url", "App Installation Guide URL")}</span> 
287 
288						<a class="font-weight-bold" href="tel:${appInstallationGuideURL}" target="_blank"> 
289							${appInstallationGuideURL} 
290						</a> 
291					</div> 
292				</div> 
293			</#if> 
294		`; 
295
296 
297	function publisherSupportModalBody() { 
298		return ` 
299			<div class="align-items-center d-flex flex-row mb-3"> 
300				<span class="align-items-center d-flex justify-content-center modal-icon-background mr-3" style="background: #E2E2E4; border-radius:50%; height:40px; overflow:hidden; width:40px;"> 
301					<#if profileImageURL?? && profileImageURL?length gt 0> 
302						<img src="${profileImageURL}" alt="Publisher Image" style="width: 100%; height: 100%; object-fit: cover; border-radius: 50%;" /> 
303					<#else> 
304						<@clay["icon"] 
305							style="fill:#6B6C7E;" 
306							symbol="picture" 
307						/> 
308					</#if> 
309				</span> 
310 
311				<div class="d-flex flex-column"> 
312					<h3 class="font-weight-bold mb-0"> 
313						${catalogName} 
314					</h3> 
315				</div> 
316			</div> 
317 
318			<#if publisherURL?has_content> 
319				<div class="align-items-center d-flex flex-row mb-3"> 
320				<span class="align-items-center d-flex justify-content-center modal-icon-background mr-3" style="background: #E2E2E4; border-radius:50%; height:40px; overflow:hidden; width:40px;"> 
321						<@clay["icon"] 
322							style="fill:#6B6C7E;" 
323							symbol="globe" 
324						/> 
325					</span> 
326 
327					<div class="d-flex flex-column"> 
328						<span class="text-black-50">${languageUtil.get(locale, "publisher-website", "Publisher Website")}</span> 
329 
330						<a href="${publisherURL}" target="_blank" class="font-weight-bold"> 
331							${publisherURL} 
332						</a> 
333					</div> 
334				</div> 
335			</#if> 
336 
337			<#if supportEmail?has_content> 
338				<div class="align-items-center d-flex flex-row mb-3"> 
339					<span class="align-items-center d-flex justify-content-center modal-icon-background mr-3" style="background: #E2E2E4; border-radius:50%; height:40px; overflow:hidden; width:40px;"> 
340						<@clay["icon"] style="fill:#6B6C7E;"symbol="envelope-closed" /> 
341					</span> 
342 
343					<div class="d-flex flex-column"> 
344						<span class="text-black-50">${languageUtil.get(locale, "support-email", "Support Email")}</span> 
345 
346						<a class="font-weight-bold" href="mailto:${supportEmail}" target="_blank"> 
347							${supportEmail} 
348						</a> 
349					</div> 
350				</div> 
351			</#if> 
352 
353			<#if supportPhone?has_content> 
354				<div class="d-flex flex-row align-items-center mb-3"> 
355					<span class="align-items-center d-flex justify-content-center modal-icon-background mr-3" style="background: #E2E2E4; border-radius:50%; height:40px; overflow:hidden; width:40px;"> 
356						<@clay["icon"] 
357							style="fill:#6B6C7E;" 
358							symbol="phone" 
359						/> 
360					</span> 
361 
362					<div class="d-flex flex-column"> 
363						<span class="text-black-50">${languageUtil.get(locale, "phone")}</span> 
364 
365						<a class="font-weight-bold" href="tel:${supportPhone}" target="_blank"> 
366							${supportPhone} 
367						</a> 
368					</div> 
369				</div> 
370			</#if> 
371		`; 
372
373 
374	function openInstallationDocsModal() { 
375		Liferay.Util.openModal({ 
376			bodyHTML: installationDocsModalBody(), 
377			center: true, 
378			headerHTML: "<h2>Installation Guide</h2>", 
379			size: "md" 
380		}); 
381
382 
383	function openPublisherSupportModal() { 
384		Liferay.Util.openModal({ 
385			bodyHTML: publisherSupportModalBody(), 
386			center: true, 
387			headerHTML: "<h2>Publisher Support Info</h2>", 
388			size: "md" 
389		}); 
390
391</script> 
392 
393<script ${nonceAttribute}> 
394	function copyToClipboard(text) { 
395		if (navigator && navigator.clipboard && navigator.clipboard.writeText) { 
396			navigator.clipboard.writeText(text); 
397 
398			Liferay.Util.openToast({ message: "Copied link to the clipboard" }); 
399
400
401</script> 
402 
403<style ${nonceAttribute}> 
404	.copy-text { 
405		color: #282934; 
406		font-size: 16px; 
407
408 
409	.help-and-support-modal { 
410		color: inherit; 
411		text-decoration: none; 
412
413 
414	.help-and-support-modal-arrow { 
415		margin-top: 3px; 
416		fill: rgb(133, 140, 148); 
417
418 
419	.help-and-support-modal:hover { 
420		color: inherit; 
421		text-decoration: none; 
422
423 
424	.help-and-support-modal-icon { 
425		color: rgb(133, 140, 148); 
426
427 
428	.help-and-support-link { 
429		color: #0053F0 !important; 
430
431 
432	.help-and-support-link:hover { 
433		color: #0041BE !important; 
434		text-decoration: underline !important; 
435
436 
437	.help-and-support-link-icon { 
438		color: #0053F0 !important; 
439
440 
441	.help-and-support-svg mask, 
442	.link-arrow mask { 
443		mask-type: alpha; 
444
445</style> 
DEVELOPER
25-9-17 下午8:33
Published date
25-9-17 下午8:33
Published Date
25-9-17 下午8:33
SUPPORTED OFFERINGS
Supported Versions
7.2
Resource Requirements
Edition
Community
PRICE
Free
help & support
SHARE LINK
Copy & Share

HTML Example

A paragraph is a self-contained unit of a discourse in writing dealing with a particular point or idea. Paragraphs are usually an expected part of formal writing, used to organize longer prose.