I am building a Django site framework which will power several independent sites, all using the same apps but with their own templates. I plan to accomplish this by using multiple settings-files and setting a unique SITE_ID for them, like suggested in the Django docs for the django.contrib.sites framework
However, I don’t want a user from site A to be able to login on site B. After inspecting the user table created by syncdb, I can see no column which might restrict a user to a specific site. I have also tried to create a user, ‘bob’, on one site and then using the shell command to list all users on the other side and sure enough, bob shows up there.
How can I ensure all users are restricted to their respective sites?
The most compatible way to do this would be to create a user Profile model that includes a foreign key to the Site model, then write a custom auth backend that checks the current site against the value of that FK. Some sample code:
Define your profile model, let’s say in app/models.py:
Write your custom auth backend, inheriting from the default one, let’s say in app/auth_backend.py:
This auth backend assumes all users have a profile; you’d need to make sure that your user creation/registration process always creates one.
The overridden
authenticatemethod ensures that a user can only login on the correct site. Theget_usermethod is called on every request to fetch the user from the database based on the stored authentication information in the user’s session; our override ensures that a user can’t login on site A and then use that same session cookie to gain unauthorized access to site B. (Thanks to Jan Wrobel for pointing out the need to handle the latter case.)