Django app to login with CAS and populate user accounts with LDAP.
Project description
django-pucas
django-pucas is a reusable Django application to simplify logging into a Django application with CAS using django-cas-ng. Login and creation of user accounts is handled by django-cas-ng; pucas adds support for prepopulating user account data based on an LDAP search.
pucas should be pronounced like pookas for the Celtic spirit creature.
django-pucas is tested against:
- Django
3.2-4.0 - Python
3.10-3.14
django-pucas requires django-cas-ng 3.6 or greater.
Installation
Use pip to install:
pip install pucas
You can also install from Github. Use @master or @0.5 to install a
specific tagged release or branch (e.g., for the latest code on develop):
pip install git+https://github.com/Princeton-CDH/django-pucas.git@develop#egg=pucas
Configuration
Add both django-cas-ng and pucas to installed apps; enable authentication middleware and django-cas-ng authentication backend:
INSTALLED_APPS = (
...
'django_cas_ng',
'pucas',
...
)
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
...
)
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'django_cas_ng.backends.CASBackend',
)
Include the default django-cas-ng login and logout urls provided with pucas, or configure them as needed based on the documentation:
urlpatterns = [
...
path('accounts/', include('pucas.cas_urls')),
...
]
Add required configurations to settings.py:
-
CAS_SERVER_URL - Base URL of your CAS source
-
Configure LDAP settings as needed to populate user attributes:
PUCAS_LDAP = {
'SERVERS': ['ldap1', 'ldap2'],
'SEARCH_BASE': 'ou=users,dc=example,dc=com',
'SEARCH_FILTER': "(uid=%(user)s)",
# attributes to request from the LDAP server
'ATTRIBUTES': ['givenName', 'sn', 'mail'],
# mapping of User attributes to LDAP attributes
# if passed list for the value, the first attribute to return a
# value will be used
'ATTRIBUTE_MAP': {
'first_name': 'givenName',
'last_name': 'sn',
'email': ['mail', 'eduPersonPrincipalName']
},
# Optional local method to do additional user initialization
# not handled by attribute map. Method should take a user
# object and ldap search result.
'EXTRA_USER_INIT': 'myproj.myapp.models.init_profile_from_ldap'
'BIND_DN': 'uid=username,o=your org,c=country_code',
'BIND_PASSWORD': 'secreupasswordforyourldap',
}
- Note:
BIND_DNandBIND_PASSWORDare optional if you want to bind anonymously. Add them if they are required by your LDAP. This supports user/pass authentication.
Run migrations to create database tables required by django-cas-ng:
python manage.py migrate
To make CAS login available on the Django admin login form, extend the
default admin login form and include or adapt the provided CAS login
template snippet. An example admin login form is included at
pucas/templates/pucas/sample-admin-login.html; copy this to
admin/login.html within a valid template directory and modify
as needed.
An example of a login template with local branding is provided at
pucas/templates/pucas/sample-pu-login.html using re-usable template
snippets that can be adapted or re-used as appropriate.
Note that login templates have not yet been updated for Django 3.x.
Usage
Users can login with CAS and have a Django user account automatically created and populated with LDAP data based on the settings.
Two manage commands are provided, for convenience.
- Use
python manage.py ldapsearch netid1 netid2 netid3for testing your LDAP configuration and attributes. - Use
python manage.py createcasuser netidto initialize a new CAS account and populate data from LDAP without requiring the user to login first, as an aid to managing accounts and permissions. The optional flag--adminwill give the new account superuser permissions
Development instructions
This git repository uses git flow branching conventions, with main as the current production release branch.
For development, we assume the usage of uv.
uv is compatible with the use of pip for python package management
and a tool of your choice for creating python virtual environments
(e.g., mamba, venv).
Initial setup and installation:
-
Install
uvif it's not installed. It can be installed via PyPI, Homebrew, or a standalone installer. See uv's installation documentation for more details. -
To explicitly sync the project's dependencies, including optional dependencies for development and testing, to your local environment run:
uv sync -
Note that
uvperforms syncing and locking automatically (e.g., any timeuv runis invoked). By default, syncing will remove any packages not specifically specified in thepyproject.toml.
Unit Testing
Unit tests are written with py.test but use some Django test classes for compatibility with django test suites. Running the tests requires a minimal settings file for Django required configurations.
-
Copy sample test settings and add a secret key:
cp ci/testsettings.py testsettings.py -
Run the tests with pytest:
uv run pytest
License
django-pucas is distributed under the Apache 2.0 License.
©2016 Trustees of Princeton University. Permission granted via Princeton Docket #18-3398-1 for distribution online under a standard Open Source license. Ownership rights transferred to Rebecca Koeser provided software is distributed online via open source.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pucas-0.10.0.dev0.tar.gz.
File metadata
- Download URL: pucas-0.10.0.dev0.tar.gz
- Upload date:
- Size: 19.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a65d1774ab087ad6f1c9d8102237ebdaa9331c53eae7e6f09f9ea03f55887b29
|
|
| MD5 |
e93a689051057271fa024d28f1bd057b
|
|
| BLAKE2b-256 |
8d3a249c7cee15bf4308b0cdfc6446c7e40ee564a277571b3f791598e7facc38
|
Provenance
The following attestation bundles were made for pucas-0.10.0.dev0.tar.gz:
Publisher:
python-publish.yml on Princeton-CDH/django-pucas
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pucas-0.10.0.dev0.tar.gz -
Subject digest:
a65d1774ab087ad6f1c9d8102237ebdaa9331c53eae7e6f09f9ea03f55887b29 - Sigstore transparency entry: 1225801149
- Sigstore integration time:
-
Permalink:
Princeton-CDH/django-pucas@731a42ee751418a3f3b7de63f3ccd064f7044e14 -
Branch / Tag:
refs/tags/0.10 - Owner: https://github.com/Princeton-CDH
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@731a42ee751418a3f3b7de63f3ccd064f7044e14 -
Trigger Event:
release
-
Statement type:
File details
Details for the file pucas-0.10.0.dev0-py3-none-any.whl.
File metadata
- Download URL: pucas-0.10.0.dev0-py3-none-any.whl
- Upload date:
- Size: 19.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
63efb9303f27fe42c486f2ef55bb9aa7a70c949d59c0a18c2b477acfa29a0e1a
|
|
| MD5 |
6dc01a21b41c3557bdb71fc321a5dc7c
|
|
| BLAKE2b-256 |
df774c5f88f7a1a27ed1317d9db6079e79fe55242f725a12ab3a7e0121880f7f
|
Provenance
The following attestation bundles were made for pucas-0.10.0.dev0-py3-none-any.whl:
Publisher:
python-publish.yml on Princeton-CDH/django-pucas
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pucas-0.10.0.dev0-py3-none-any.whl -
Subject digest:
63efb9303f27fe42c486f2ef55bb9aa7a70c949d59c0a18c2b477acfa29a0e1a - Sigstore transparency entry: 1225801228
- Sigstore integration time:
-
Permalink:
Princeton-CDH/django-pucas@731a42ee751418a3f3b7de63f3ccd064f7044e14 -
Branch / Tag:
refs/tags/0.10 - Owner: https://github.com/Princeton-CDH
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@731a42ee751418a3f3b7de63f3ccd064f7044e14 -
Trigger Event:
release
-
Statement type: