2011-12-09 27 views
10

Trong Rails hướng dẫn trong http://edgeguides.rubyonrails.org/security.html, phần 6.1, nó giới thiệu một vai trò cho attr_accessible với: là tùy chọn,Vị trí và cách chỉ định người dùng: vai trò quản trị cho attr_accessible trong đường ray 3.1?

attr_accessible :name, :is_admin, :as => :admin 

Câu hỏi của tôi là, nếu một người dùng đăng nhập, ở đâu và làm thế nào tôi có thể gán người dùng: admin vai trò để cô/anh ấy có quyền được giao hàng loạt với attr_accessible? Ngoài ra tôi có thể xác định vai trò của riêng mình như group_to_update không? Nếu có, những gì nên đi vào định nghĩa của group_to_update?

Cảm ơn.

Trả lời

32

Bạn đang sử dụng một số thuật ngữ kỹ thuật theo những cách mơ hồ làm cho sự hiểu biết của bạn về quá trình này bị xáo trộn, vì vậy tôi sẽ làm rõ thuật ngữ này trước tiên.

ở đâu và làm thế nào tôi có thể gán người dùng: admin vai trò

Các 'vai trò' được sử dụng trong các tham số :as để attr_accessible không phải là một vai trò người dùng. Đây là vai trò thuộc tính. Nó có nghĩa là thuộc tính được bảo vệ khỏi ghi đè trừ khi vai trò đó được xác định trong câu lệnh đặt thuộc tính. Vì vậy, hệ thống này độc lập với bất kỳ hệ thống người dùng nào. Ứng dụng của bạn thậm chí không cần phải có người dùng để có vai trò trong giao hàng loạt.

tôi có thể xác định vai trò của mình như group_to_update

Vai trò không thực sự "định nghĩa" trong bất kỳ ý nghĩa chính thức nào cả. Ở bất kỳ nơi nào mà vai trò được mong đợi, chỉ cần sử dụng bất kỳ biểu tượng/chuỗi nào (ví dụ: :group_to_update) làm vai trò. Không cần phải xác định nó bất cứ nơi nào khác trước thời hạn.

Đây là cách hoạt động. Thông thường, trong quá trình gán khối lượng của một hàm băm cho các thuộc tính mô hình, tất cả các thuộc tính của mô hình được sử dụng như các khóa cho hàm băm được chỉ định.Vì vậy, nếu bạn có một mô hình Barnbarn thể hiện của nó, với ba thuộc tính horse, cat, và rabbit, thì đây:

barn.attributes = params 

về cơ bản là giống như thực hiện:

barn.horse = params[:horse] 
barn.cat = params[:cat] 
barn.rabbit = params[:rabbit] 

Bây giờ, nếu bạn đặt bất kỳ attr_accessible nào trên mô hình chuồng, chỉ những thuộc tính bạn đặt ở đó sẽ được cập nhật khi bạn sử dụng gán hàng loạt. Ví dụ:

class Barn < ActiveRecord::Base 
    attr_accessible :cat 
    attr_accessible :rabbit 
end 

Sau đó này:

barn.attributes = params 

Sẽ chỉ làm điều này:

barn.cat = params[:cat] 
barn.rabbit = params[:rabbit] 

Bởi vì chỉ có 'mèo' và 'thỏ' được thiết lập để truy cập ('ngựa' không phải là). Bây giờ xem xét việc thiết một vai trò quan thuộc tính như thế này:

class Barn < ActiveRecord::Base 
    attr_accessible :cat 
    attr_accessible :rabbit, :as => :banana 
end 

Đầu tiên, lưu ý rằng vai trò có thể bởi bất cứ điều gì bạn muốn miễn là nó là một biểu tượng/chuỗi. Trong trường hợp này, tôi đã thực hiện vai trò :banana. Bây giờ, khi bạn đặt vai trò trên thuộc tính attr_accessible, thông thường nó sẽ không được gán. Đây:

barn.attributes = params 

sẽ bây giờ chỉ làm điều này:

barn.cat = params[:cat] 

Nhưng bạn có thể gán thuộc tính sử dụng một vai trò cụ thể bằng cách sử dụng phương pháp assign_attributes. Vì vậy, bạn có thể làm:

barn.assign_attributes(params, :as => :banana) 

này sẽ gán tất cả params thường được bảo vệ cũng như tất cả params được bảo vệ dưới vai trò :banana:

barn.cat = params[:cat] 
barn.rabbit = params[:rabbit] 

Vì vậy, hãy xem xét một ví dụ nữa với nhiều thuộc tính:

class Barn < ActiveRecord::Base 
    attr_accessible :cat 
    attr_accessible :rabbit, :as => :banana 
    attr_accessible :horse, :as => :banana 
    attr_accessible :cow, :as => :happiness 
end 

Sau đó, bạn có thể sử dụng các vai trò đó khi gán thuộc tính. Đây:

barn.assign_attributes(params, :as => :banana) 

Tương ứng với:

barn.cat = params[:cat] 
barn.rabbit = params[:rabbit] 
barn.horse = params[:horse] 

Và đây:

barn.assign_attributes(params, :as => :happiness) 

Tương ứng với:

barn.cat = params[:cat] 
barn.cow = params[:cow] 

Bây giờ, nếu bạn chọn để , bạn có thể tạo vai trò người dùng (ví dụ: cột "vai trò" trên Mô hình người dùng của bạn) tương ứng với vai trò thuộc tính trên bất kỳ mô hình nào.Vì vậy, bạn có thể làm một cái gì đó như thế này:

barn.assign_attributes(params, :as => user.role) 

Nếu vai trò này của user sẽ xảy ra là banana, sau đó (sử dụng mô hình cuối cùng dụ của chúng tôi) nó sẽ thiết lập các thuộc tính về chuồng cho mèo, thỏ, và ngựa. Nhưng đây chỉ là một cách để sử dụng vai trò thuộc tính. Nó hoàn toàn tùy thuộc vào bạn nếu bạn muốn sử dụng chúng theo một cách khác.

+3

+1 Câu trả lời hay. – Gazler

+0

Cảm ơn bạn. Nó có lẽ là bài viết duy nhất đi vào chi tiết tuyệt vời về vai trò trong attr_accessible. Một câu hỏi nữa, làm thế nào vai trò sẽ ngăn cản việc chuyển nhượng hàng loạt xảy ra? Không có cách nào để một hacker có thể bao gồm vai trò trong URL? – user938363

+0

Câu trả lời hay. Điều này nên ở đâu đó [trong hướng dẫn?] Trong tài liệu Rails. – maprihoda

3

Điều này nhằm bảo vệ chống lại việc gán hàng loạt khi liên kết của bạn giải thích.

Trong đường ray (để cập nhật), điều này chỉ ảnh hưởng đến cuộc gọi update_attributes. Bạn vẫn có thể sử dụng các phương thức update_attribute hoặc admin = để gán biến quản trị viên.

User.first.update_attributes(:name => "Gazler", :admin => true) #this will not work 
User.first.update_attribute(:admin, true) #This will work 

#This will also work 
user = User.first 
user.admin = true 
user.save 

Bạn có thể muốn xem qua sử dụng gem for your permissions. Cancan có lẽ là phổ biến nhất.

+0

Tại đây bạn đã sử dụng bài tập riêng lẻ sẽ luôn hoạt động. Nhưng ai có thể là vai trò quản trị và cách trở thành vai trò quản trị? Tôi cho rằng admin là một phương thức có thể được định nghĩa. – user938363

+0

Không, quản trị viên trong trường hợp này sẽ là thuộc tính trên Mô hình người dùng của bạn. Bạn có thể gán điều này trong bảng điều khiển đường ray hoặc thông qua một biểu mẫu giống như bất kỳ thuộc tính nào khác. – Gazler

1

Nhìn vào phương pháp assign_attributes.

Tóm lại, nó cho phép bạn gán các thuộc tính chỉ khi bạn cũng chuyển vai trò. Các tài liệu có các ví dụ mã rất dễ hiểu và dễ hiểu. Theo một cách nào đó, nó hoạt động giống như một bộ lọc, hoặc bảo vệ.

Các vấn đề liên quan