2008-12-08 31 views
5

Kullanıcı izinlerini karşılayan birçok ray eklentisi var. Hobo gemindeki uygulamadan etkilendim, ama sadece bu özelliği kullanıp kullanamayacağımı ve diğer parçaları kullanamayacağımı emin değilim. GateKeeper gerçekten akıllı bir uygulamadır, ancak bazı hatalar vardır, ancak yeterince küçük olsa da muhtemelen kendim tamir edebilirim. Restful_ACL, oluşturulma durumunu kontrol etmek için size bir sınıf metodu verir, yani söz konusu örnek üzerinde herhangi bir kontrol yapamazsınız (scoped bulguları yapıp yapmadığından emin değil).Raylar Kullanıcı Erişimi Eklentileri

ActiveRecord # bulmak için geçerli kullanıcının yalnızca görmesine izin verilen şeyleri içeren kapsamlı bir sürüm sunan bir şeyden hoşlanmam. Bu, söyleyecek kadar sağlam olmalı, sadece sizin veya arkadaşlarınızın sahip olduğu galerilerde bulunan resimleri görebilirsiniz.

Bir bonus olarak, farklı bir kullanıcı veya galeriyle kendi kayıtlarınızı ilişkilendirmek veya bu kayıtları oluşturmak da dahil olmak üzere, gerçekleştirme hakkınızın olmadığı oluşturma veya güncellemelerin (before_ * veya validation adımında) engellenmesi olabilir. .

cevap

0

Geriye doğru bakıldığında, sadece Hobo desen kullanacağız: Ben küçük değişiklikler yapan ediyorum gerçi, Milan Novota en pasajı gibi. En basit ve en esnek olanıdır.

0

lockdown'a bakabilirsiniz. Bunu henüz projede uygulamamıştım ama size bazı işler kazandırabilir.

3

declarative_authorization eklentisiyle model düzeyinde gerçekten karmaşık yetkilendirme kodları yapabilirsiniz. Yine de, ben kendim rails-authorization-plugin'u tercih ederim - bununla birlikte, model seviyesindeki rolleri (örneğin, bir kaynağın bir sahibi) ve kontrolör seviyesindeki izinleri tanımlayın (örn. Sadece bir kaynağın veya yöneticinin sahibi kaynak). Bu yaklaşımı çok daha özlü buluyorum, özellikle temiz bir REST yaklaşımı için çalışıyorsanız. Eğer bunun gibi bir isteğiniz varsa: Gerçekten dönmek gerektiğini

GET /posts 

bütün Mesajları, geçerli kullanıcının sadece mesajlar olduğunu. Bu amaçla farklı bir rota olmalıdır: user_id geçerli kullanıcının kimliği olarak ayarlanır:

GET /users/:user_id/posts 

. Bu fark daha sonra uygun eylem yansıtılmış edilmelidir:

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 

Şimdi, gerçekten burada ne var iki yetkilendirme bağlamları vardır - "Bir kullanıcının tüm mesajlar almak" ve "tüm mesajları olsun" ve genellikle istiyorum Her ikisi için farklı izinler ayarlayın (örn. "yalnızca yöneticiler tüm gönderileri alabilir" ve "sadece kendinin veya bir yöneticinin bir kullanıcının tüm mesajlarını alabilir").

+0

Rethful_authentication ve raylar-auth eklentisinin bir birleşimini kullanıyorum. Rails Auth çok güçlü ve izinlerinizi tanımlamak için eksiksiz bir DSL sağlıyor. –

+0

Bu, restful_authentication, elbette: P –

1

Tamamen rollerine göre nesneler için izinler belirtebilmeniz gereken bir mücevher var. Bir göz atabilirsiniz: http://github.com/nakajima/roleful/tree/master. Size atıfta bulunduğunuz before_filter yaklaşımına göre iyi çalışır.

Kullanıcıların yalnızca bir tür ilişkisine sahip oldukları şeylere erişmelerine izin vermek için, Rails ilişkilendirme proxy'leri için birincil bir adayı aradığınızı düşünürdüm.

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 
İlgili konular