You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
3.5 KiB
150 lines
3.5 KiB
Write a custom plugin
|
|
=====================
|
|
|
|
Presentation
|
|
------------
|
|
|
|
Standard entry points
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
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
|
|
|
|
Extended entry points
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
If you need to call a method just after any standard method in
|
|
authentication process, then use ``afterSub``, for example:
|
|
|
|
.. code-block:: perl
|
|
|
|
use constant afterSub => {
|
|
getUser => 'mysub',
|
|
};
|
|
sub mysub {
|
|
my ( $self ,$req ) = @_;
|
|
# Do something
|
|
return PE_OK;
|
|
}
|
|
|
|
If you need to call a method instead any standard method in
|
|
authentication process, then use ``aroundSub``, for example:
|
|
|
|
.. code-block:: perl
|
|
|
|
use constant aroundSub => {
|
|
getUser => 'mysub',
|
|
};
|
|
sub mysub {
|
|
my ( $self, $sub, $req ) = @_;
|
|
# Do something before
|
|
my $ret = $sub->($req);
|
|
# Do something after
|
|
return $ret;
|
|
}
|
|
|
|
|
|
Hooks
|
|
~~~~~
|
|
|
|
.. versionadded:: 2.0.10
|
|
|
|
Your plugin can also register itself to be called at some points of interest
|
|
within the main LemonLDAP::NG code.
|
|
|
|
.. toctree::
|
|
:maxdepth: 1
|
|
|
|
hooks
|
|
|
|
Routes
|
|
~~~~~~
|
|
|
|
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
|
|
|
|
|
|
.. tip::
|
|
|
|
If you do not want to mix files from the distribution with
|
|
your own work, put your own code in
|
|
``/usr/local/lib/site_perl/Lemonldap/NG/Portal/MyPlugin.pm``\
|
|
|
|
.. code-block:: perl
|
|
|
|
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
|
|
|
|
.. code-block:: perl
|
|
|
|
[portal]
|
|
customPlugins = Lemonldap::NG::Portal::MyPlugin
|
|
;customPlugins = Lemonldap::NG::Portal::MyPlugin1, Lemonldap::NG::Portal::MyPlugin2, ...
|
|
|
|
Since 2.0.7, it can also be configured in Manager, in General Parameters
|
|
> Plugins > Custom Plugins.
|
|
|