Frage

Es gibt eine Menge von Schienen-Plugins gibt, die Griffbenutzerberechtigungen. Ich bin beeindruckt von der Implementierung in dem Hobo Juwel, aber ich bin nicht sicher, ob ich gerade diese Funktion verwenden kann und nicht auf die anderen Teile. Gatekeeper ist eine wirklich clevere Implementierung, hat aber einige Fehler, obwohl es klein genug ist, ich es wahrscheinlich selbst beheben kann. Restful_ACL gibt Ihnen eine Klassenmethode für die Erstellung überprüft, so dass Sie keine Kontrollen auf der Instanz in Frage tun können (nicht sicher, ob es Funde nicht scoped).

würde Ich mag etwas, das eine scoped Version von Active # find liefert, die nur Dinge der aktuelle Benutzer findet sehen darf. Dies sollte robust genug sein, zu sagen, können Sie nur Bilder angezeigt, die in Galerien, die von Ihnen oder einem Ihrer Freunde gehören.

Als Bonus, könnte es verhindern, erstellt oder aktualisiert (in einem before_ * oder Validierungsschritt), die Sie nicht das Recht haben, zu erfüllen, einschließlich Ihrer eigenen Aufzeichnungen mit einem anderen Benutzer oder eine Galerie zuordnet, oder solche Aufzeichnungen zu schaffen.

War es hilfreich?

Lösung 4

Im Nachhinein, ich will nur das Hobo Muster verwenden. Es ist die einfachste und flexibelste.

Andere Tipps

Sie können mit declarative_authorization Plugin einige wirklich komplexe Berechtigungs Tricks auf der Modellebene tun . Trotzdem habe ich mich lieber Schienen-berechtigungs Plugin - mit diesem Sie die Rollen auf der Modellebene definieren (z. B. jemand einen Eigentümer einer Ressource ist) und die Berechtigungen für die Controller-Ebene (z. B. nur der Besitzer einer Ressource oder Administrator kann die Ressource bekommen). Ich finde diesen Ansatz viel prägnante, vor allem, wenn Sie für einen sauberen REST-Ansatz verfolgen. Wenn Sie Anfrage wie diese:

GET /posts

, was Sie wirklich zurückkehren sollte ist alle Beiträge , nicht nur die Beiträge des aktuellen Benutzers. Zu diesem Zweck sollten Sie eine andere Route haben:

GET /users/:user_id/posts

Dabei gilt: user_id ist auf aktuellen Benutzers id. Dieser Unterschied soll dann in den entsprechenden Maßnahmen, gespiegelt werden:

def index
  user = User.find(params[:user_id]) unless params[:user_id].blank?
  @posts =
   if user
    # get all posts of a user
    user.posts.all
   else
    # get all posts 
    Post.all
   end
end

Nun, was Sie wirklich hier sind zwei Berechtigungskontexte haben - „alle Beiträge eines Benutzers erhalten“ und „alle Beiträge bekommen“, und Sie wollen in der Regel unterschiedliche Berechtigungen für beide (zB um „nur können Administratoren alle Beiträge bekommen“. und „nur Benutzer es selbst oder ein Administrator kann alle Beiträge eines Benutzers erhalten“).

Ich habe ein Juwel, das für Objekte Berechtigungen festlegen vollständig über die Möglichkeit, ist auf der Grundlage ihrer Rolle. Sie können hier einen Blick: http://github.com/nakajima/roleful/tree/master . Es wäre gut für die Art von before_filter Ansatz, den Sie angedeutet.

Was nur die Benutzer Dinge zuzugreifen, mit denen sie eine Art von Beziehung haben, würde ich denken, dass Sie für Rails Verein Proxies zu einem Hauptkandidaten suchen. Ich mag Milan Novota das Snippet, obwohl ich es ändern würde etwas:

def index
  @posts = user_repo.posts
end

private

def user_repo
  # find_by_id is **much** faster than regular find,
  # plus it just returns nil when there's no record
  if user = User.find_by_id(params[:user_id])
    # returns the association proxy
    user.posts
  else
    # returns the class
    User
  end
end

Sie können Besuche Lockdown . Ich habe das nicht auf Projekt noch nicht umgesetzt, aber es könnte Ihnen einige Arbeit speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top