#3669: Restructure django.contrib.auth, make Models replaceable
------------------------------------------------------+---------------------
Reporter:  David Danier <[EMAIL PROTECTED]>  |       Owner:  adrian             
        
  Status:  new                                        |   Component:  Contrib 
apps               
 Version:  SVN                                        |    Keywords:  auth 
rewrite replace models
   Stage:  Unreviewed                                 |   Has_patch:  0         
                 
------------------------------------------------------+---------------------
 = Problem =
 I'm currently not very happy with the current auth-module. It mixed three
 different things I think:
  * API for user-authentication and permission-checks
  * implementation of user-system
  * implementation of permission-system
 
 The problem is, that you cannot replace parts of this system, without
 replacing everything (and ending in having to write a new auth-system
 thats incompatible with some generic_views, the admin, ...). So I think
 this parts should be separated and some generic-API should be created.
 
 Btw.: I was told, that there was a bug for this problem, but I didn't find
 it, sorry.
 
 = Possible solution =
 I think that should be separated into three apps. Some generic API should
 be used to authenticate the user and check permissions. The implementation
 of the real models/checks should be done in separate applications that can
 be replaced (so you would be able to replace the user-model for example).
 
 If doing so I suggest dropping the current backends-implementation,
 because it may break things. The problem is that request.user is filles by
 these backends and as backends may return objects that are not
 django.contrib.auth.models.User code will fail that needs that class (->
 foreign keys). So I think one user-model should be used, and only one.
 Backends could be done by using some user-model that saved some type and
 id and wrapps the real user-object, if backends are really needed. This
 has the advantage of one user-model that can be used in your models for
 foreign keys.
 
 As some(/many) code depends on the current auth-models this must be
 rewritten (this is probably the most annoying part), as an example the
 create_update-generic-views use the message-system and
 user.is_authenticated(). Some user-API could be defined as a standard for
 such cases.
 
 Perhaps the message-system should get it's own application, as many users
 like and use this.
 
 = Possible contributions by me so far =
 I started creating a auth-replacement for the first part (the API), while
 trying to keep the current API where possible.
 References:
  * http://groups.google.com/group/django-
 developers/msg/623ad2f878d9ebde?hl=en& (post to django-developers,
 describing some problems, too)
  * https://svn.webmasterpro.de/django-auth-rewrite/django/contrib/newauth/
 (branch I created, including a generic API)
 
 The current code includes parts of whats done in the generic-auth/row-
 level-permissions-branch so far. But no implementation is included, only
 some API is defined, that can be used.
 
 In the setting-file the user can set two additional options:
  * AUTHENTICATION_MODULE: Module used for authentication
  * AUTHORIZATION_MODULE: Module used for authorization (aka permission
 checks)
 
 These modules have to implement some simple API, in detail:
  * AUTHENTICATION_MODULE:
    * get_anonymous_user: done as a function, as the user may be saved in
 the database
    * get_user_model: used to create working foreign keys
    * login_redirect: redirect to the login (the modules get full control
 over the views, nothing is implemented in the auth-module so far)
    * authenticate: like with the backends
    * is_authenticated: moved from the user-object
  * AUTHORIZATION_MODULE:
    * has_model_permission: test if a user may access a model
    * has_object_permission: test if a user may access an object (may
 (only) include model-check of course)
    * denied_redirect: as above (may just return a HttpResponse, too)
 
 The code includes some decorators and a fork of the
 middleware/context_processor (with changed import-statements).
 
 The models-file is only used to get the User-model into models (for
 backwards compability).
 
 I think the code can be written nicer by just importing the functions of
 the modules (like done with the User-Model), but I haven't tested this
 yet.
 
 If you are interested in this branch I will continue converting the old
 models and functionality. ;-)

-- 
Ticket URL: <http://code.djangoproject.com/ticket/3669>
Django Code <http://code.djangoproject.com/>
The web framework for perfectionists with deadlines
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to