Skip to main content

LDAP/AD Plugin for Plone/Zope PluggableAuthService (users+groups)

Project description

Latest PyPI version

Number of PyPI downloads

CI

This is a LDAP Plugin for the Zope Pluggable Authentication Service (PAS).

pas.plugins.ldap is not releated to the old LDAPUserFolder / LDAPMultiPlugins and the packages (i.e. PloneLDAP) stacked on top of it in any way.

It is based on node.ext.ldap, an almost framework independent LDAP stack.

Features

  • If Plone is installed an integration layer with a setup profile and a Plone Controlpanel page is available.
  • It works in a plain Zope even if it depends on PlonePAS.
  • LDAP authentication and authorization for users and groups.
  • It provides users and/or groups from an LDAP directory.
  • LDAP properties for users and groups, which can be used in the rest of the system as well.
  • For now users and groups can't be added or deleted. Properties on both are read/write.

TODO

For a detailed list of TODO tasks to this project, please checkout the TODO file.

Screenshots

After installation, you will find a new behavior available, go to Site Setup > Users > LDAP / AD Support as the following screenshot:

pas.plugins.ldap Plone control panel

Translations

This product has been translated into

  • English
  • Spanish

Installation

This package supports Zope applications and Plone sites using Volto and Classic UI.

Dependencies

This package depends on python-ldap package.

To build it correctly you need to have some development libraries included in your system.

On a Debian-based installation use:

sudo apt install python-dev libldap2-dev libsasl2-dev libssl-dev

Zope

Install pas.plugins.ldap by adding it to the instance section of your buildout:

eggs =
    ...
    pas.plugins.ldap

zcml =
    ...
    pas.plugins.ldap

Run buildout and then restart the Zope instance.

Then browse to your acl_users folder and add an LDAP Plugin object.

Configure it using the LDAP Settings form and choose the functionality this LDAP Plugin will perform with the Activate tab.

  • Authentication (authenticateCredentials)
  • Group_Enumeration (enumerateGroups)
  • Group_Introspection (getGroupById)
  • Group_Management (addGroup)
  • Groups (getGroupsForPrincipal)
  • Properties (getPropertiesForUser)
  • Roles (getRolesForPrincipal)
  • User_Adder (doAddUser)
  • User_Enumeration (enumerateUsers)
  • User_Management (doChangeUser)

Plone

To install pas.plugins.ldap in a Plone site, you need by adding it to the instance section of your buildout:

eggs =
    ...
    pas.plugins.ldap

Run buildout and then restart the Plone instance.

Then go to the Plone control-panel, select Addons and install the LDAP / Active Directory Support.

So, you can navigate to Site Setup > Users > LDAP / AD Support and click it and configure the plugin there.

To use an own integration-profile, add to the profiles metadata.xml file:

...
<dependencies>
    ...
    <dependency>profile-pas.plugins.ldap.plonecontrolpanel:default</dependency>
</dependencies>
...

Additionally the LDAP Settings can be exported and imported with portal_setup tool. You can place the exported ldapsettings.xml file in your integration profile, so it will be imported with your next install again.

Warning:

The LDAP-password is stored in there in plain text!

But anonymous bindings are possible.


Logging

To get detailed output of all LDAP-operations and much more set the logging level to debug. Attention, this is lots of output.

LDAP as an external service might be down, non-responsive or slow. This package logs such events to raise awareness. There are two environment variables to control the logging of LDAP-errors:

PAS_PLUGINS_LDAP_ERROR_LOG_TIMEOUT : First LDAP-error is logged, further errors ignored until the given number of seconds have passed. This supresses flooding logs if LDAP is down. Default: 300.0 (time in seconds, float).

PAS_PLUGINS_LDAP_LONG_RUNNING_LOG_THRESHOLD : Log long running LDAP/PAS operations. If a PAS operation takes longer than he given number of seconds, log it as error. Default: 5 (time in seconds, float).


Timeouts

Global LDAP timeouts are set and controlled by two environment variables:

PAS_PLUGINS_LDAP_OPT_NETWORK_TIMEOUT : Connection timeout. Default: 1.0s

PAS_PLUGINS_LDAP_OPT_TIMEOUT : Overall timeout. Default: 30.0s

See details in python-ldap documentation: OPT_NETWORK_TIMEOUT and OPT_TIMEOUT.


Caching

Without caching this module is slow (as any other module talking to LDAP will be).

By default the LDAP-queries are not cached.

A must have for a production environment is having memcached server configured as LDAP query cache.

Cache at least for ~6 seconds, so a page load with all its resources is covered also in worst case.

The UGM tree is cached by default on the request, that means its built up every request from (cached) ldap queries.

There is an alternative adapter available which will cache the ugm tree as volatile attribute (_v_...) on the persistent plugin.

Volatile attributes are not persisted in the ZODB.

If the plugin object vanishes from ZODB cache the atrribute is gone.

The volatile plugin cache can be activated by loading its zcml with <include package="pas.plugins.ldap" file="cache_volatile.zcml".

The caching time can be influenced by overriding the value in pas.plugins.ldap.cache.VOLATILE_CACHE_MAXAGE.

It defaults to 10 and its unit is seconds.

Note:

Caching the UGM tree longer than one request means it could contain outdated data.

If you plan a different implementation of UGM tree caching,provide your own adapter implementing pas.plugins.ldap.interfaces.IPluginCacheHandler.

Limitations and Future Optimizations

This package was not tested/developed with Windows. It may work under Windows if python-ldap is installed properly and recognized by buildout.

This package works fine for several 10000 users or groups, unless you list users.

This is not that much a problem for small amount of users. There is room for future optimization in the underlying node.ext.ldap.


Development Workflow

  1. Install requirements:
make install
  1. Start Zope instance:
make zope-start
  1. Zpretty format and lint XML/ZCML:
make zpretty-check && make zpretty-format && make zpretty-check
  1. Lint and format Python code with ruff (this is what CI enforces):
uvx ruff check . && uvx ruff format .
  1. Extract i18n messages:
make gettext-create && make gettext-update && make gettext-compile

The compiled .mo catalogs are also generated automatically when the package is built (sdist/wheel), so they always ship in a release.

  1. Run unit tests:
make test
  1. Run coverage unit tests:
make coverage

Source Code

If you want to help with the development (improvement, update, bug-fixing, ...) of pas.plugins.ldap this is a great idea!

Authors

This product was developed by BlueDynamics Alliance team.

BlueDynamics Alliance

Maintainers are Robert Niederreiter, Jens Klein and the BlueDynamics Alliance developer team.

Support

We appreciate any contribution. Releases to PyPI are automated via tagging and Trusted Publishing; see RELEASE.md for the process. If you need a release done, please contact one of us: dev@bluedynamics dot com.

  • If you are having issues, please let us know at our issue tracker.

Contributors

For a list of all contributors to this project, please checkout the following resources:

License

The project is licensed under the GPLv2.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pas_plugins_ldap-2.0.0rc1.tar.gz (51.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pas_plugins_ldap-2.0.0rc1-py2.py3-none-any.whl (71.8 kB view details)

Uploaded Python 2Python 3

File details

Details for the file pas_plugins_ldap-2.0.0rc1.tar.gz.

File metadata

  • Download URL: pas_plugins_ldap-2.0.0rc1.tar.gz
  • Upload date:
  • Size: 51.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pas_plugins_ldap-2.0.0rc1.tar.gz
Algorithm Hash digest
SHA256 c2b5f50369e6bf90226d11d6a105a2c40d61d7b3917233d3e25e5307da2d9afc
MD5 f3f2bf4edec8f97182b5158af0082130
BLAKE2b-256 f70f4c02b319a654329b93510fd04cf75219296e1fe7d3cea9fa6c743eba1f5b

See more details on using hashes here.

Provenance

The following attestation bundles were made for pas_plugins_ldap-2.0.0rc1.tar.gz:

Publisher: release.yaml on collective/pas.plugins.ldap

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pas_plugins_ldap-2.0.0rc1-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for pas_plugins_ldap-2.0.0rc1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 539e1b502acf2079c2988a497501f4e7af6159c25a751b5a1da1a16f276b456d
MD5 1673a2941739247d5c6e24d18ce6cb7e
BLAKE2b-256 1157fed2d9dde8e18733fb9501976253999d7ea22f96d644ec5a4868363c1e65

See more details on using hashes here.

Provenance

The following attestation bundles were made for pas_plugins_ldap-2.0.0rc1-py2.py3-none-any.whl:

Publisher: release.yaml on collective/pas.plugins.ldap

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page