2016-06-10 13 views
0

Wenn Benutzer 1 creat dieses Ticket: mywebsite/Manager/Tickets/Ticket-from-user-1/verhindert, dass Benutzer Daten eines anderen Benutzers zuzugreifen, wenn die Schnecke in der URL eingeben

und Benutzer 2 erstellen, dass: mywebsite/manager/tickets/ticket-from-user-2/

Wie kann ich verhindern, dass Benutzer 1 auf das Ticket von Benutzer 2 oder anderen Benutzern zugreifen, indem Sie es in die URL eingeben?

views.py

class TicketDisplay(LoginRequiredMixin, DetailView): 
    model = Ticket 
    template_name = 'ticket_detail.html' 
    context_object_name = 'ticket' 
    slug_field = 'slug' 

    def get_context_data(self, **kwargs): 
     context = super(TicketDisplay, self).get_context_data(**kwargs) 
     context['form_add_comment'] = CommentForm() 
     return context 

url.py

url(r'^manager/tickets/(?P<slug>[-\w]+)/$',views.TicketDetail.as_view(), name='ticket_detail') 

Antwort

1

Ich habe diese Funktionalität kürzlich in einem Projekt implementiert. Dies kann durch Verwendung automatisch generierter UUIDs geschehen. Django hat a built-in model field dafür, oder Sie können ein Slug-Feld verwenden und geben Sie einen Standardwert. Hier ist ein kurzes Beispiel.

Importieren Sie in Ihrer models.py-Datei die UUID-Bibliothek, und legen Sie den Standardwert Ihres Slug-Felds auf UUID.UUID4 fest.

models.py:

import uuid 

class Ticket(models.Model): 
    uuid = models.SlugField(default=uuid.uuid4, editable=False) 
    ... 

In urls.py, benutzen Sie einfach die UUID Feld, als wäre es ein Stück waren. Etwas wie folgt aus:

url(r'^manager/tickets/(?P<uuid>[0-9a-z-]+)/?$', TicketDetail.as_view(), name='ticket-detail'), 

In Ihrem Detail, Aktualisieren und Löschen von Ansichten, müssen Sie sicherstellen, und legen diese beiden Attribute, so dass Django weiß, welches Feld als Schnecke zu verwenden:

slug_field = 'uuid' 
slug_url_kwarg = 'uuid' 

Dann in Ihren Vorlagen und wann immer Sie ein Objekt für die Kwargs abrufen müssen, verwenden Sie einfach die UUID anstelle von PK.

Hinweis: Darüber hinaus sollten Sie auch alles mit Berechtigungen ausführen, um zu verhindern, dass Benutzer andere Seiten sehen. Möglicherweise können Sie bestimmte Konten sperren, um andere Personen anzuzeigen. Zum Beispiel könnten Sie wahrscheinlich einen Berechtigungs-Mix schreiben, um zu überprüfen, ob request.user mit dem Objekt übereinstimmt, das die Ansicht verarbeitet.

TLDR Das setzt voraus, dass Sie irgendeine Art von Beziehung zu einem Benutzer auf Ihrem Ticket Modell haben:

class SameUserOnlyMixin(object): 

    def has_permissions(self): 
     # Assumes that your Ticket model has a foreign key called user. 
     return self.get_object().user == self.request.user 

    def dispatch(self, request, *args, **kwargs): 
     if not self.has_permissions(): 
      raise Http404('You do not have permission.') 
     return super(SameUserOnlyMixin, self).dispatch(
      request, *args, **kwargs) 

Schließlich hält es wie folgt zu Ihrer Ansicht auf:

class TicketDisplay(LoginRequiredMixin, SameUserOnlyMixin, DetailView): 
    ... 
0

Sie müssen Benutzer 1 haben etwas, das Benutzer 2 kann nicht nachahmen machen.

Bevorzugter Weg wäre, Ihre vorhandenen Authentifizierungsmethoden zu verwenden und zu überprüfen, ob der Benutzer auf die Seite zugreifen darf.

Wenn Sie keine Registrierung auf Ihrer Website haben, dann könnten Sie einige zufällige Zeichenfolge generieren - secret - und speichern Sie es mit der Frage. Wenn 'user' das secret hat dann ist er erlaubt.

Diese geheime Zeichenfolge kann in einem Cookie gespeichert oder Teil der URL sein.

Das Speichern in einem Cookie hat einen Nachteil: Wenn ein Cookie verloren geht, kann niemand auf die Seite zugreifen. Auch Benutzer können nicht von einem anderen Browser darauf zugreifen.

Es Teil der URL zu machen, hat einen weiteren Nachteil: Wenn jemand den Link sieht, kann er auch auf diese Seite zugreifen. Dies könnte schlecht sein, wenn die Software des Benutzers automatisch Berichte über die von ihm besuchten Orte sendet.

Die Kombination dieser Ansätze hat beide Nachteile.