documentation:2.0:plugincustom
Keywords: documentation,2.0,plugincustom

# Write a custom plugin

## Presentation

You can now write a custom portal plugin that will hook in the authentication process:

- `beforeAuth`: method called before authentication process
- `betweenAuthAndData`: method called after authentication and before setting “sessionInfo” provisionning
- `afterData`: method called after “sessionInfo” provisionning
- `endAuth`: method called when session is validated (after cookie build)
- `authCancel`: method called when user click on “cancel” during auth process
- `forAuthUser`: method called for already authenticated users
- `beforeLogout`: method called before logout

The plugin can also define new routes and call actions on them.

See also `Lemonldap::NG::Portal::Main::Plugin` man page.

## Example

### Plugin Perl module

Create for example the MyPlugin module:

    vi /usr/share/perl5/Lemonldap/NG/Portal/MyPlugin.pm

    package Lemonldap::NG::Portal::MyPlugin;

    use Mouse;
    use Lemonldap::NG::Portal::Main::Constants;
    extends 'Lemonldap::NG::Portal::Main::Plugin';

    use constant beforeAuth => 'verifyIP';

    sub init {
              my ($self) = @_;
              $self->addUnauthRoute( mypath => 'hello', [ 'GET', 'PUT' ] );
              $self->addAuthRoute( mypath => 'welcome', [ 'GET', 'PUT' ] );
              return 1;
    }
    sub verifyIP {
              my ($self, $req) = @_;
              return PE_ERROR if($req->address !~ /^10/);
              return PE_OK;
    }
    sub hello {
              my ($self, $req) = @_;
              ...
              return $self->p->sendJSONresponse($req, { hello => 1 });
    }
    sub welcome {
              my ($self, $req) = @_;

              my $userid = $req->user;
              $self->p->logger->debug("Call welcome for $userid");

              ...
              return $self->p->sendHtml($req, 'template', params => { WELCOME => 1 });
    }
    1;

### Configuration

Declare the plugin in lemonldap-ng.ini:

    vi /etc/lemonldap-ng/lemonldap-ng.ini

    [portal]
    customPlugins = Lemonldap::NG::Portal::MyPlugin
    ;customPlugins = Lemonldap::NG::Portal::MyPlugin1, Lemonldap::NG::Portal::MyPlugin2, ...