/o//commerce-media/accounts/-1/images/27196549?download=true
Welcome to the documentation for our Marketplace module designed for
Multifactor Authentication (MFA) in Liferay Community Edition. This
module introduces a secure OTP (One-Time Password) authentication
feature, adding an extra layer of protection to your Liferay
environment. It is easy to integrate and enhances login security,
making it a valuable tool for safeguarding user accounts. Whether you
are new to Liferay or an experienced user, this guide will help you
understand and implement OTP authentication seamlessly.
Prerequisites :
Liferay Portal 7.4.X
Basic knowledge of Liferay
How to use the Multi-factor Authentication Module
01) SMTP
Configuration
Navigate to the Control Panel > Instance Setting
> Email > Mail Settings
Setup your SMTP Configuration
02) Multi-factor Authentication Configuration
Navigate to the
Control Panel > category. login-configuration
Set up your email
to send the emails for OTP and select the type of authentication as
shown in the image below
Once you configure "Authentication with OTP...", the
system will ask for OTP from users every time they log in to the portal.
Installation guideline availabe at this link
For "." left-hand operand: Expected a hash, but this has evaluated to a string (wrapper: f.t.SimpleScalar): ==> publisePages [in template "3192443#3192485#null" at line 36, column 38] ---- FTL stack trace ("~" means nesting-related): - Failed at: #assign publisePage = publisePages.items [in template "3192443#3192485#null" at line 36, column 17] ----
1<#if themeDisplay?has_content>
2 <#assign scopeGroupId = themeDisplay.getScopeGroupId() />
3</#if>
4
5<#if currentURL?has_content>
6 <#if currentURL?contains('web')>
7 <#assign
8 index = 2
9 partsUrl = currentURL?split('/')
10 siteName = partsUrl[index..index]?join('/')
11 />
12 </#if>
13</#if>
14
15<#assign channel = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels?accountId=-1&filter=name eq 'Marketplace Channel' and siteGroupId eq '${scopeGroupId}'") />
16
17<#if channel?has_content>
18 <#assign channelId = channel.items[0].id />
19</#if>
20
21<#if (CPDefinition_cProductId.getData())??>
22 <#assign productId = CPDefinition_cProductId.getData() />
23</#if>
24
25<#assign
26 product = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels/"+ channelId +"/products/"+ productId +"?accountId=-1&nestedFields=productSpecifications")
27 productSpecifications = product.productSpecifications![]
28 catalogName=product.catalogName
29/>
30
31<#if catalogName?has_content>
32 <#assign publisePages=restClient.get("/c/publisherdetailses?filter=publisherName eq '${catalogName}'" ) />
33 <#assign redirectPath="https://marketplace.liferay.com/e/publisher-details/29282497"/>
34
35 <#if publisePages?has_content>
36 <#assign publisePage=publisePages.items />
37 <#if publisePage?has_content>
38 <#assign publisherDetail=publisePage[0]/>
39 </#if>
40 </#if>
41</#if>
42
43<div>
44 <#if productSpecifications?has_content>
45 <#assign developerNames = productSpecifications?filter(item -> stringUtil.equals(item.specificationKey, "developer-name")) />
46
47 <#if developerNames?has_content>
48 <#list developerNames as developerName>
49 <#if publisherDetail?has_content>
50 <a class="bg-neutral-8" href="${redirectPath}/${publisherDetail.id}">
51 ${developerName.value}
52 </a>
53 <#else>
54 <a class="bg-neutral-8" href="/?developer-name=${developerName.value}">
55 ${developerName.value}
56 </a>
57 </#if>
58 </#list>
59 </#if>
60 </#if>
61</div>
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.