/o//commerce-media/accounts/-1/images/18525144?download=true
TwoWay Premium is a plugin providing Two Steps Authentication to
access you Liferay portal instance.
Two steps verification adds an extra security layer for your
Liferay Portal account by requiring user to enter a one-time
verification code in addition to your username and password, when
signing in to your account. Our code is based on well-know libraries,
open algorithms and standards and fit perfectly in Liferay Portal, so
is possibile to enable it together with other authentication provider
like LDAP.
Into portal control panel, Admin can:
- enable TwoWay
Authentication per portal as for embedded Liferay's methods
-
(ONLY IN THE PREMIUM VERSION!) choose which OTP delivery channels
enable for portal users (check below for possible methods)
- (ONLY
IN THE PREMIUM VERSION!) set two-step authentication as mandatory for
all the users
- (ONLY IN THE PREMIUM VERSION!) add IP white lists
in order to disable OTP from company network or other trusted zone
(you can disable IP's checks setting the specific portal properties
"twowayauthentication.webserver.headers.forwardedfor" to
"skip".)
- (ONLY IN THE PREMIUM VERSION!) disable Backup
Codes functionality
- (ONLY IN THE PREMIUM VERSION!) enable
"Force authentication by email", that can be useful if a
user forget it's phone
Into personal control panel, User can:
- enable or disable
TwoWay for its specific account
- choose how to obtain the OTP
choosing from Admin's enabled channel set
- manage Backup Codes,
useful if a user forgot or changed it's phone
- manage Application
Passwords in order to grant access to specific applications like
Liferay Sync
OTP delivery methods:
- (ONLY IN THE PREMIUM VERSION!)
Email
- SMS: in this case you have to configure a Twilio
account
- Apps: Google Authenticator, Authy, LastPass or other
similar apps free available on platform specific store
Encryption:
- (ONLY IN THE PREMIUM VERSION!) user's Hashcode
is stored as encrypted
- (ONLY IN THE PREMIUM VERSION!) user's
Backup code are stored as encrypted
The following has evaluated to null or missing: ==> product.catalogName [in template "3192443#3192485#null" at line 28, column 21] ---- 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: catalogName = product.catalogName [in template "3192443#3192485#null" at line 28, column 9] ----
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.