我正在构建一个应用程序,它使用Salesforce作为数据存储的后端。这意味着除了用户之外,我的数据库中没有其他模型。我不能对rails使用传统的授权解决方案,因为它们要求我访问rails模型。
我正在构建的应用程序需要对用户有一定的权限。用户有两种状态: User:unactivated :activated
我将触发来自Salesforce的用户状态的更改。
我有需要根据用户状态进行保护的视图。我不确定处理这一问题的最可伸缩的方法是用户模型中的一个简单的状态列,并且在我的视图中只让<%= current_user.state ==“激活”%>,还是有更好的解决方案?
谢谢
发布于 2014-06-28 03:50:56
在Rails 4.1中引入的Active Record的一个新特性Enum是实现您的需求的最简单方法。您可以实现一种非常基本的基于角色的授权形式,使用具有两种状态的单个角色“激活”。
创建一个迁移:
$ rails generate migration AddRoleToUsers role:integer迁移将如下所示:
class AddRoleToUsers < ActiveRecord::Migration
def change
add_column :users, :role, :integer
end
end向用户模型中添加代码以实现Enum:
class User < ActiveRecord::Base
enum role: [:activated, :unactivated]
after_initialize :set_default_role, :if => :new_record?
def set_default_role
self.role ||= :unactivated
end
end定义角色的名称,如果有必要,可以根据需要更改名称(存储在每个用户记录中的整数值保持不变)。Active Record将将属性的赋值限制为预定义值的集合,因此您不必添加任何代码来将角色的名称限制为定义的集合。最重要的是,枚举提供了一组方便的方法,允许您直接查询角色而不需要任何额外的代码。对于名为role的enum属性,在激活和未激活值时,可以使用以下方法:
User.roles # => {"activated"=>0, "unactivated"=>1} # list all roles
user.activated! # make the user activated
user.activated? # => true # query if the user is activated
user.role # => "activated" # find out the user’s role
@users = User.activated # obtain an array of all users who are activated
user.role = 'foo' # ArgumentError: 'foo' is not a valid, we can’t set invalid roles您可以在控制器中使用条件:
class UsersController < ApplicationController
def index
unless current_user.activated?
redirect_to :back, :alert => "Access denied."
end
@users = User.all
end
end或者在视图中使用它:
<% if current_user.activated? %>
<li><%= link_to 'Special Reports', some_path %></li>
<% end %>通常,如果访问控制为控制器添加了大量代码,则建议您使用CanCanCan或专家,因为您可以将复杂的授权逻辑移动到与控制器隔离的中心位置(“瘦控制器”)。但是,如果您的需求如您所描述的那么简单,则控制器中基于角色的授权是最优的。
我编写了一个Rails专家教程,它比较了两种方法,并提供了关于简单的基于角色的授权以及基于角色的权威授权的更多细节。
发布于 2014-06-27 22:28:41
您可以使用cancan (cancancan),有一个选项可以让您对控制器进行授权。
authorize_resource :class => false你可以在他们的wiki 这里上读到更多这方面的内容,这是一个开始。
https://stackoverflow.com/questions/24461275
复制相似问题