Thursday, May 28, 2015

LDAP Integration with Liferay

LDAP Integration with Liferay

Introduction about LDAP:


The Lightweight Directory Access Protocol (LDAP) is a directory service protocol that runs on a layer above the TCP/IP stack. It provides a mechanism used to connect to, search, and modify Internet directories. The LDAP directory service is based on a client-server model.

 Directory services play an important role in developing intranet and Internet applications by allowing the sharing of information about users, systems, networks, services, and applications throughout the network.[2] As examples, directory services may provide any organized set of records, often with a hierarchical structure, such as a corporate email directory. Similarly, a telephone directory is a list of subscribers with an address and a phone number.

There are multiple vendors providing implementation of LDAP, But i will mention few of the commonly used LDAP Servers.

1. Apache Directory Server

2. Open LDAP

3. Windows Directory Services etc.

Here i am going to show an example how to configure LDAP and How to integrate it with Liferay 6.1, currently i have implemented in Liferay 6.1 it should work higher versions of liferay also.

I will use Apache Directory Server for LDAP here.

Liferay LDAP Configuration with Apache Directory Server

Steps Involved:

1. First of all we have to download a directory server the given link below is the apache ds download link.



2.  Install the server by followed by the steps given on same website . Now our DS(Directory Server) is installed. 


3.  Now open the Apache DS by double click on the icon on your desktop , you will see Eclipse Type Apache Directory Studio is open in front of You.



4.  Now  Right Click on LDAP Server Tab and create New Server




5.      Now Select one of the following servers available (Select latest one i.e 2.0.0 )





 6.      Click on finish, you have successfully configured your LDAP server. Now we will create 
new connection to server so that we can create users directly in our LDAP server  for 
Creating new Connection our Server should be running. So just Start the Server For that Right Click on Server and Click on Create a Connection.







 7.      Now you will see you have successfully created a connection. Basic Directory Structure Look like this.








 8.    We are ready with our LDAP Server running.  Now we have to configure Liferay to use this server for our purposes. For that navigate to


Control Panel à Portal Settings à Authentication à LDAP



9.      Now Click on Add Server you will have a long screen with some prefilled values , where you have to provide your configuration settings

a.    Server name  (You can give any name as of your choice. )




         b.      Default Values (Choose LDAP Server you are Usinf for us it is Apache DS)

  

  c.     Connection
            Base Provider URL:  This is the URL of your LDAP server (ldap://host:port             ) for us it is  “ldap://localhost:10389” .  to confirm go to your LDAP Browser and Right Click on Root DSE and select properties anf navigate to
Connection à Network Parameter





           Base DN: It is Initial search context of  Users will be searched(For us it is                                            dc=example,dc=com)

Principal:  It is  Binding DN or User (For us it is uid=admin,ou=system)
Credentials: It is the Binding Password (For us it is “secret”)

To confirm go to your LDAP Browser and Right Click on Root DSE and select properties anf navigate to
                                            Connection à Authentication




             Finally our connection settings look like this


              



1.      Now Click on Test LDAP Connection, if every thing is good you will see the message below.








1.      Users  Now you have provide information related to Users. Let Us see  little Description about these fields.


Authentication Search Filter:  It is the field of User Mapping which will be used to check the Validity of User.(For Us We will use cn=@screen_name@)

Import Search Filter:  It is the objectClass which will be used filter users during Importing Users from LDAP to your Portal.(for us it will be as it is i.e objectClass=person )







1.      User Mapping   Here you have to provide required fields of User which will be used in importing and exporting  Users. These are common fields which doesn’t need any description .




Note: The required fields must be filled  either in exporting or importing Users otherwise you will get Error Message.


1.      Now Click on Test LDAP Users, if everything is good  you will see List of Users fetched  from your LDAP Server

Note: To perform Test LDAP Server should be running and LDAP Server Should contain Users otherwise it will show no Users exist.



1.      Groups:  This Section conteins settings for mapping LDAP groups to Liferay.



1.      Export  This Section Contains settings for Exporting Users from LDAP.






1.      Now In our case we are going to use LDAP Password policy for that we have to put a property in our portal-ext.properties file

p                            passwords.passwordpolicytoolkit.generator=static


1.      Now you have to enable your portal to use LDAP as a Authentication Medium for that you have to enable the option in
Control Panel à Portal Settings à Authentication à LDAP

Note: There is another option Required with Enable , Required option is to specify that Users must be authenticated through LDAP Only.

  1. Now check the Use LDAP Password Policy option and import , Export option As per your requirement.

    Now you are all set with all the necessary settings required to use your LDAP Server to Authenticate Users as well as Import and Export Users to and from LDAP
















Wednesday, May 27, 2015

Multiple Scheduler in Liferay

Sometimes we need to run more than one scheduler (multiple scheduler) in our liferay portlet.
Below are the steps of  how we can achieve this.

Steps

Step 1:
Create one liferay project of portlet plugin type, in our example project name is Scheduler,    (suffix portlet will automatically added after project name) so after creation project complete name will be Scheduler-portlet

Step 2: Create two new java class  FirstScheduler.java and SecondScheduler.java   inside docroot/web-inf/src/com/test

Step 3: Paste below code in FirstScheduler.java 

package com.test;

import com.liferay.portal.kernel.messaging.Message;
import com.liferay.portal.kernel.messaging.MessageListener;
import com.liferay.portal.kernel.messaging.MessageListenerException;

public class FirstScheduler implements MessageListener {

public void receive(Message arg0) throws MessageListenerException {
      
        System.out.println("First scheduler  is running ...");
      
    }
   
}
 

Step 4: Paste below code in SecondScheduler.java

package com.test;

import com.liferay.portal.kernel.messaging.Message;
import com.liferay.portal.kernel.messaging.MessageListener;
import com.liferay.portal.kernel.messaging.MessageListenerException;

public class SecondScheduler implements  MessageListener {

    public void receive(Message arg0) throws MessageListenerException {
      
        System.out.println("Second scheduler  is running ...");
      
    }
}
 

Step 5: Paste below code in liferay-portlet.xml for defining scheduler entry for two scheduler.

<?xml version="1.0"?>
<!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 6.2.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_6_2_0.dtd">

<liferay-portlet-app>
   
    <portlet>
        <portlet-name>schedule</portlet-name>
        <icon>/icon.png</icon>
        <scheduler-entry>
               <scheduler-description>FirstScheduler</scheduler-description>
               <scheduler-event-listener-class>com.test.FirstScheduler</scheduler-event-listener-class>
               <trigger>
                   <simple>
                      <simple-trigger-value>1</simple-trigger-value> 
                      <time-unit>minute</time-unit>  
                   </simple>
               </trigger>
        </scheduler-entry>

        <scheduler-entry>
               <scheduler-description>SecondScheduler</scheduler-description>
               <scheduler-event-listener-class>com.test.SecondScheduler</scheduler-event-listener-class>
               <trigger>
                     <simple>
                      <simple-trigger-value>2</simple-trigger-value> 
                      <time-unit>minute</time-unit>  
                   </simple>
               </trigger>
       </scheduler-entry>
      
        <header-portlet-css>/css/main.css</header-portlet-css>
        <footer-portlet-javascript>
            /js/main.js
        </footer-portlet-javascript>
        <css-class-wrapper>schedule-portlet</css-class-wrapper>
    </portlet>
    <role-mapper>
        <role-name>administrator</role-name>
        <role-link>Administrator</role-link>
    </role-mapper>
    <role-mapper>
        <role-name>guest</role-name>
        <role-link>Guest</role-link>
    </role-mapper>
    <role-mapper>
        <role-name>power-user</role-name>
        <role-link>Power User</role-link>
    </role-mapper>
    <role-mapper>
        <role-name>user</role-name>
        <role-link>User</role-link>
    </role-mapper>
</liferay-portlet-app>


Step 6 : Paste below code in portlet view.jsp 

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<portlet:defineObjects />

<p style="border:1px solid green;">Multiple Scheduler in Liferay</p>
<p>Multiple Scheduler, Two scheduler will trigger, First Scheduler will trigger on every 1 min interval
and Second Scheduler will trigger on every 2 min interval.
</p>

 

Output: 


 

 

Scheduler In Liferay



                             
Sometimes  it requires to execute some backend code on regular interval or at some specific time.
For example : wants to send mail to user on regular interval  or at specific time.
Liferay has provided feature of  scheduler for achieving this kind of requirement.

For scheduling we are using two types of trigger:
1. Simple Trigger (when ever scheduling requirement is based on regular interval basis, will use simple trigger)
2. Cron Trigger  (Whenever scheduling requirement is based on some specific time, will use cron  trigger)

Simple Trigger Scheduler  Steps

Step 1: Create one liferay project of portlet plugin type, in our example project name is Scheduler,    (suffix portlet will automatically added after project name) so after creation project complete name will be Scheduler-portlet
Inside that Scheduler-portlet project create one portlet , in our example portlet class name is Schedule.
Step 2: Create one class name SimpleTrigger     inside docroot/web-inf-src/com/test/ , after class creation complete path will be  docroot/web-inf-src/com/test/SimpleTrigger
This simpleTrigger class  will implements  MessageListener
 Below is the complete code of  SimpleTrigger class.

package com.test;

import com.liferay.portal.kernel.messaging.Message;
import com.liferay.portal.kernel.messaging.MessageListener;
import com.liferay.portal.kernel.messaging.MessageListenerException;

public class SimpleTrigger implements MessageListener  {
       public void receive(Message arg0) throws MessageListenerException {
            //any logic whatever you want to execute, you can write here.
              System.out.println("simple trigger scheduler example...");
       }
}

Step 3: Paste below code in portlet view.jsp

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<portlet:defineObjects />

<p style="border:1px solid green;">Liferay Scheduler</p>
<p>Simple Trigger Scheduler, Trigger every 1 min interval</p>

Step 4: In liferay-portlet.xml define scheduler entry like below

<?xml version="1.0"?>
<!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 6.2.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_6_2_0.dtd">

<liferay-portlet-app>
      
       <portlet>
              <portlet-name>schedule</portlet-name>
              <icon>/icon.png</icon>
              <scheduler-entry> 
             <scheduler-event-listener-class>com.test.SimpleTrigger</scheduler-event-listener-class> 
             <trigger> 
               <simple> 
                  <simple-trigger-value>1</simple-trigger-value>  
                  <time-unit>minute</time-unit>   
               </simple> 
             </trigger> 
        </scheduler-entry> 
              <header-portlet-css>/css/main.css</header-portlet-css>
              <footer-portlet-javascript>
                     /js/main.js
              </footer-portlet-javascript>
              <css-class-wrapper>schedule-portlet</css-class-wrapper>
       </portlet>
       <role-mapper>
              <role-name>administrator</role-name>
              <role-link>Administrator</role-link>
       </role-mapper>
       <role-mapper>
              <role-name>guest</role-name>
              <role-link>Guest</role-link>
       </role-mapper>
       <role-mapper>
              <role-name>power-user</role-name>
              <role-link>Power User</role-link>
       </role-mapper>
       <role-mapper>
              <role-name>user</role-name>
              <role-link>User</role-link>
       </role-mapper>
</liferay-portlet-app>


*In above scheduler entry we have used
<scheduler-event-listener-class>com.test.SimpleTrigger</scheduler-event-listener-class>
for defining  scheduler event listener class path.
<trigger></trigger>
using trigger tag we have defined which trigger we are going to use simple/cron, in this example we are using simple trigger.

in <time-unit> tag we can give hour,day,week value also.
*In this simple trigger example , for every 1 min of regular interval code written inside receive method will execute.

Output

Cron Trigger Scheduler Steps


sometime, we may need that scheduler job  run  at specific time [say 11 :20PM, each tuesday ] job should run. Trigger specified in above code(simple trigger) will not work in that case. For this type of requirement we can specify cron trigger.

Step 1: Create one liferay project of portlet plugin type, in our example project name is Scheduler,    (suffix portlet will automatically added after project name) so after creation project complete name will be Scheduler-portlet
Inside that Scheduler-portlet project create one portlet , in our example portlet class name is Schedule.

Step 2
 <%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<portlet:defineObjects />

<p style="border:1px solid green;">Liferay Scheduler</p>
<p>Cron Trigger Scheduler, Trigger every year,every month,every day,every hour, every minute on 10's second</p>
Step 3: Create one new class name CronTrigger     inside docroot/web-inf-src/com/test/ , after class creation complete path will be  docroot/web-inf-src/com/test/CronTrigger
This CronTrigger class  will implements  MessageListener
 
 Below is the complete code of  CronTrigger class.

package com.test;

import com.liferay.portal.kernel.messaging.Message;
import com.liferay.portal.kernel.messaging.MessageListener;
import com.liferay.portal.kernel.messaging.MessageListenerException;

public class CronTrigger implements MessageListener  {

   
    public void receive(Message arg0) throws MessageListenerException {
       
        System.out.println("Cron trigger scheduler example...");
       
    }

}

Step 4: Define  scheduler entry  for cron trigger in liferay-portlet.xml

<trigger> 
              <cron> 
                 <cron-trigger-value>10 * * ? * * *</cron-trigger-value> 
              </cron>
 </trigger>



[above cron text specify : every year,every month,every day,every hour, every minute on 10's second]


 MIN  HOUR  DAYOFMONTH  MONTH  DAYOFWEEK  YEAR

Some Example Cron-text:

"0 0 12 * * ? *"                    Fire at 12pm (noon) every day
"0 15 10 ? * * *"                  Fire at 10:15am every day
"0 10,44 14 ? 3 WED *"     Fire at 2:10pm and at 2:44pm every Wednesday in the month of March.
"0 15 10 ? * MON-FRI *"  Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday
 



complete liferay-portlet.xml code:

<?xml version="1.0"?>
<!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 6.2.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_6_2_0.dtd">

<liferay-portlet-app>
   
    <portlet>
        <portlet-name>schedule</portlet-name>
        <icon>/icon.png</icon>
        <scheduler-entry>
             <scheduler-event-listener-class>com.test.CronTrigger</scheduler-event-listener-class> 
             <trigger> 
              <cron> 
                 <cron-trigger-value>50 * * ? * * *</cron-trigger-value> 
              </cron> 
            </trigger>
        </scheduler-entry> 
        <header-portlet-css>/css/main.css</header-portlet-css>
        <footer-portlet-javascript>
            /js/main.js
        </footer-portlet-javascript>
        <css-class-wrapper>schedule-portlet</css-class-wrapper>
    </portlet>
    <role-mapper>
        <role-name>administrator</role-name>
        <role-link>Administrator</role-link>
    </role-mapper>
    <role-mapper>
        <role-name>guest</role-name>
        <role-link>Guest</role-link>
    </role-mapper>
    <role-mapper>
        <role-name>power-user</role-name>
        <role-link>Power User</role-link>
    </role-mapper>
    <role-mapper>
        <role-name>user</role-name>
        <role-link>User</role-link>
    </role-mapper>
</liferay-portlet-app>
Output :