Skip to main content

SQLAlchemy-based PAS user/group/prop store.

Project description

SQLAlchemy PAS plugin

This package provides a Zope 2 PAS plugin implementation (Pluggable Authentication Service) based on the SQLAlchemy database abstraction layer.

It allows you to store and query users and groups using a SQL database.

This package replaces the SQLPASPlugin product and is technically a fork of that codebase. Some tests have been rewritten but most are preserved.

Although not currently provided in a stable release, it’s used in production (tested against the pysqlite and PostgreSQL databases only).


To configure the plugin with a database, use z3c.saconfig and define a named scoped session “pas.plugins.sqlalchemy” in your configure.zcml or in the “zcml-additional” parameter of the plone.recipe.zope2instance recipe in your buildout.


<configure xmlns="">
  <include package="z3c.saconfig" file="meta.zcml"/>

  <engine name="pas" url="postgresql://localhost/pas" />
  <session name="pas.plugins.sqlalchemy" engine="pas" />


Install the plugin using the included GenericSetup-profile. Note that tables will be created automatically on installation.

You can reinstall anytime to create non-existing tables. Note that tables are preserved on uninstallation.

Configuration from Plone

As an alternative to specifying the database connection information in zcml, you can use collective.saconnect to make your connections configurable on the plone control panel.

Install the package by adding it to your buildout, then install the add-on it in your plone site through Plone’s control panel. You now have a new control panel that allows you to create and edit database connections.

To add connections with generic setup add a file “saconnections.xml” to the generic setup profile of your site setup package, with the following content:

<?xml version="1.0"?>

More information is available in the package description.

Custom principal, user and group model

You can register your own SQLAlchemy-based model class for all three categories.

The required class interfaces (required methods and attributes) are described in the interfaces module. Note that you can simply subclass from the default models which implement the required interfaces.

The settings are accessible in the ZMI. You can also use a custom setup handler.


def setup_pas_plugin(self):
    pas = self.acl_users
    plugin = pas['sql']


You may need to make sure the plugins are prioritized higher than the default ones (typically ZODB-based).


These items are on the to-do list:

  • Post-only security.

  • Review of implemented interfaces - is the implementation complete?

  • Handle groups title, description and email, to match newer versions of Plone.

  • Tests for configuration of external model.





  • Thanks to Inc. for financing the development of SQLPASPlugin

  • Thanks to Statens Byggeforskninginstitut ( for sponsoring the caching support.

  • Thanks to Gis & Web S.r.l. ( for sponsoring the groups management support.

  • Thanks to the Ocean Tracking Network ( for adding Group Capabilities and migration of existing users.


GNU GPL v2 (see LICENCE.txt for details)


0.3 (2011-10-13)

  • Fire IPropertiesUpdated (from PAS) event on setPropertiesForUser to allow components to take action when user properties are updated. [malthe]

  • Merged SVN repository (select branches) into the existing Github repository to consolidate improvements. [malthe]

  • Add title and description to groups.

    GetRolesForPrincipal needs to listen to __ignore_group_roles__ and __ignore_direct_roles__ from the request to work with plone 4. GetRolesForPrincipal needs to take group roles into account as default. [sunew]

  • Merged many changes from the branches: wichert-flexible, wichert-flexible-pw-encryption, zedr-mysql-optimized, auspex.

    Version 0.3 is not compatible with the earlier versions, upgrading will require some migration (not included). [sunew]

  • Seperate user_id and login - as in PAS. (Not complete?) [wichert]

  • Refactor user, group, and principal classes to enable more sharing of functionality between groups and users. [wichert]

  • Length of varchars to be compatible with MySQL [auspex, wichert, sunew, zedr]

  • Cleaned up the properties - only the plone properties are in the model now. Override the model if you need more fields. [sunew]

  • Password and salt readonly. [wichert, sunew]

  • remove IUpdatePlugin related stuff. Not used. [wichert]

  • Make models configurable via dotted path zmi properties. [wichert]

  • Also make the Principal class configurable. [sunew]

  • Add missing security declarations (match those for the same methods in PlonePAS and PluggableAuthService). [sunew]

  • Fully implement IRoleAssignerPlugin: missed doRemoveRoleFromPrincipal. [sunew]

  • More tests, tests pass for plone 4.0.7. [sunew]

0.2.1 (unreleased)

  • Fixed some tests. Now tests passes on plone 4.0.7. [sunew]

  • Convert to and from UTF-8 and unicode. Plone uses UTF-8 internally and most Python deployments will coerce using the ‘ascii’ codec, resulting in unicode decode errors. [mborch]

0.2 (released 2009/7/17)

  • Changed the ‘listed’ and ‘ext_editor’ column type to ‘Integer’ match the Plone model. [seletz]

0.1 (released 2009/7/17)

  • Initial public release.

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.sqlalchemy-0.3.tar.gz (26.2 kB view hashes)

Uploaded Source

Supported by

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