2

Django 1.9 を使用しています。クラスベースのビューに PermissionRequiredMixin を追加しようとすると、期待どおりに動作しないようです。auth_group に新しいユーザーを作成しました。この auth_group には、どのアプリやモデルに対する権限もありません。この新しいユーザーは、スーパーユーザーまたは管理者ユーザーではありません。ただし、アプリは、permission_required が必要な特定のビューにこのユーザーがアクセスすることを妨げません。

まず、ユーザーに権限がないことを確認するために私が試みたのは次のとおりです。

user.get_all_permissions() # return set() - empty permission, which is correct.
user.is_superuser # return false, which is correct.
user.has_perm('myapp.add_something or even any words that make no sense')  # always return true, which is very weird.

アプリにはカスタム ユーザー モデルがあり、AUTHENTICATION_BACKENDS として django-allauth も使用します。PermissionRequiredMixin が user.has_perm() をチェックし、常に true を返すかどうかわからないので、権限のチェックが期待どおりに機能しないのはなぜですか?

# views.py
class My_View(PermissionRequiredMixin, View):
    permission_required = 'polls.can_vote'

    def get(self, request, *args, **kwargs):
        # do something...
        return render(request, "template.html", {})


# models.py - Custom User Model
class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    group = models.ManyToManyField(Group, through='UserGroupRelationship')
    .... 

# models.py - many-to-many relationship between user and group
class UserGroupRelationship(models.Model):
    user = models.ForeignKey("CustomUser") 
    user_group = models.ForeignKey(Group)

また、urls.py で許可を確認する古い方法も試しました。ユーザーのアクセスも妨げないので、PermissionRequiredMixin を使用することの問題ではないと思います。

urlpatterns = patterns('',

    (r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),
)
4

1 に答える 1

2

この問題に数日を費やした後、最終的に原因を突き止めました。

PermissionRequiredMixin に関するソース コードを調べたところ、PermissionRequiredMixin が実際に user.has_perm() をチェックしていることがわかりました。has_perm() のソース コードを見つけようとしたとき、コード ( Django のドキュメントのカスタム ユーザー モデルの例からコピーされたもの) に次のオーバーライドされたメソッドが含まれていることがわかりました...

def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

これが、user.has_perm('anything') が常に true を返す理由であり、これは PermissionRequiredMixin の機能にも影響します。したがって、Django を初めて使用し、ドキュメントからいくつかのサンプル コードをコピーしようとする場合は、各行に細心の注意を払う必要があります...

于 2016-01-25T02:43:03.770 に答える