Comment puis-je utiliser Django autorisations sans définir un type de contenu ou de modèle?
Je voudrais utiliser une des autorisations de système à base de restreindre certaines actions au sein de mon application Django. Ces actions ne doivent pas être liées à un modèle en particulier (par exemple, l'accès aux articles dans l'application, recherche...), donc je ne peux pas utiliser le stock d'autorisations de cadre directement, parce que l' Permission
modèle nécessite une référence à une fois installé, le type de contenu.
Je pourrais écrire mon propre modèle d'autorisation mais je vais avoir à réécrire tous les goodies inclus avec le Django autorisations, telles que:
- La possibilité d'affecter des autorisations à des utilisateurs et des groupes.
- La
permission_required
décorateur. .has_perm
et connexes de l'utilisateur méthodes.- La
permissions
variable de modèle. - ...
J'ai vérifié certaines applications, comme django-autorité et django-gardien, mais ils semblent fournir des autorisations encore plus couplé au modèle du système, en permettant par-les autorisations de l'objet.
Est-il un moyen de réutiliser ce cadre sans avoir défini un modèle (d'ailleurs User
et Group
) pour le projet?
Vous devez vous connecter pour publier un commentaire.
De Django reinhardt,
Permission
modèle nécessite unContentType
exemple.Je pense qu'un moyen de contourner cela est de créer un mannequin
ContentType
qui n'est pas relié à un modèle (leapp_label
etmodel
champs peuvent être définis à toute la chaîne de valeur).Si vous voulez qu'il soit tout propre et agréable, vous pouvez créer un
Permission
le modèle proxy qui gère tous les laids, les détails de la tétine,ContentType
et crée des "modelless" l'autorisation des instances. Vous pouvez également ajouter un gestionnaire qui filtre tous lesPermission
instances associées à de vrais modèles.Pour ceux d'entre vous qui sont toujours à la recherche de:
Vous pouvez créer un auxiliaire de modèle avec pas de table de base de données. Ce modèle peut apporter à votre projet toutes les autorisations dont vous avez besoin. Il n'est pas nécessaire de traiter avec le ContentType ou créer des objets d'Autorisation explicite.
Juste après
manage.py migrate
vous pouvez utiliser ces autorisations comme les autres.Suivantes Gonzalo conseils, j'ai utilisé un le modèle proxy et un personnalisés du gestionnaire de à gérer ma "modelless" autorisations avec un mannequin de type de contenu.
FieldError: Cannot resolve keyword 'name' into field. Choices are: app_label, id, logentry, model, permission
.name
à partir du paramètre, j'ai euIntegrityError: NOT NULL constraint failed: auth_permission.content_type_id
, je ne peut pas envelopper la tête autour de cela, peut @Chewie peut-être mettre à jour votre application?get_query_set
?Correctif pour Chewie réponse dans Django 1.8, ce qui a été demandé dans quelques commentaires.
Il est dit dans les notes de version:
Donc, c'est le "nom", en référence à ContentType qui les utilise pas dans GlobalPermissions.
Quand j'ai corrigé, je reçois le suivant:
La GlobalPermissionManager classe est inchangée, mais inclus pour l'intégralité.
À la place de l'écrit et de l'exécution de ce code qui insère des enregistrements dans la base de données vous pouvez simplement insérer les enregistrements dans votre base de données (évidemment édition les clés primaires et étrangères, selon les besoins)
Et puis dans votre application admin vous avez la possibilité d'attribuer 'Est Membre du Personnel' à vos utilisateurs ou des groupes. Pour vérifier cette autorisation dans votre classe, vous devez écrire
C'est la solution alternative. D'abord vous demander: Pourquoi ne pas créer un Mannequin-Modèle qui existe vraiment dans la DB, mais jamais, jamais, jamais utilisé, sauf pour la tenue des autorisations? Ce n'est pas agréable, mais je pense qu'il est valide et simple de la solution.
Solution ci-dessus a l'avantage, que vous pouvez utiliser la variable
Permissions.can_search_blue_flower
dans votre code source au lieu d'utiliser la chaîne littérale "my_app.can_search_blue_flower". Cela signifie moins de fautes de frappe et plus de la saisie semi-automatique dans l'IDE.managed=False
vous permettent pas d'utiliserPermissions.can_search_blue_flower
pour une raison quelconque?