#30284: Redundant is_active check in auth.backends.ModelBackend
-------------------------------------+-------------------------------------
     Reporter:  Tobias Bengfort      |                    Owner:  nobody
         Type:                       |                   Status:  new
  Cleanup/optimization               |
    Component:  contrib.auth         |                  Version:  master
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  1                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Description changed by Tobias Bengfort:

Old description:

> See https://github.com/django/django/pull/11037
>
> `User.is_active` is checked in `ModelBackend.get_all_permissions()`,
> `ModelBackend.has_perm()` and `ModelBackend.has_module_perms()`. I think
> the last two are redundant and should be removed.
>
> timgraham had
> [https://github.com/django/django/pull/11037#pullrequestreview-217534553
> concerns] though:
>
> > I'm unsure about removing the "redundant" is_active checks. It might be
> that some ModelBackend sublcasses rely on them. For example, if you
> subclass get_all_permissions() and omitting the is_active check (which
> wasn't there prior to Django 1.8
> [https://github.com/django/django/commit/c33447a50c1b0a96c6e2261f7c45d2522a3fe28d
> c33447a])... then your application would still have is_active checks in
> the other methods. This needs careful consideration and perhaps a
> discussion on the mailing list as to whether the benefits are worth the
> possible security issues. At least a release note is required. I'm not
> sure if this is required as part of the "BaseBackend" change, but I think
> it merits its own ticket.
>
> My opinion is exactly the opposite: If a ModelBackend subclass does not
> check `is_active` in `get_all_permissions()` that is a bug and
> potentially even a security issue. The redundand checks  hide these
> issues and therefore make it harder to find them.
>
> I also think that the different methods should be consitent: If a
> permission is returned by `get_all_permissions()`, then checking that
> permission with `has_perm()` should return `True`. The only reason to do
> anything special in `has_perm()` is for performance optimizations.

New description:

 See https://github.com/django/django/pull/11037

 `User.is_active` is checked in `ModelBackend` on all of these methods:

 - `get_user_permissions()`
 - `get_group_permissions()`
 - `get_all_permissions()`
 - `has_perm()`
 - `has_module_perms()`

 I think the last three are redundant and should be removed.

 timgraham had
 [https://github.com/django/django/pull/11037#pullrequestreview-217534553
 concerns] though:

 > I'm unsure about removing the "redundant" is_active checks. It might be
 that some ModelBackend sublcasses rely on them. For example, if you
 subclass get_all_permissions() and omitting the is_active check (which
 wasn't there prior to Django 1.8
 
[https://github.com/django/django/commit/c33447a50c1b0a96c6e2261f7c45d2522a3fe28d
 c33447a])... then your application would still have is_active checks in
 the other methods. This needs careful consideration and perhaps a
 discussion on the mailing list as to whether the benefits are worth the
 possible security issues.

 My opinion is exactly the opposite: If a ModelBackend subclass does not
 check `is_active` in `get_all_permissions()` that is a bug and potentially
 even a security issue. The redundand checks hide these issues and
 therefore make it harder to find them.

 I also think that the different methods should be consitent: If a
 permission is returned by `get_all_permissions()`, then checking that
 permission with `has_perm()` should return `True`. The only reason to do
 anything special in `has_perm()` is for performance optimizations.

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/30284#comment:1>
Django <https://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 unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/060.2cab0b4206494f4ff543300993392972%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to