首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有外部数据源的Rails 4应用程序中的授权

具有外部数据源的Rails 4应用程序中的授权
EN

Stack Overflow用户
提问于 2014-06-27 21:49:42
回答 2查看 199关注 0票数 1

我正在构建一个应用程序,它使用Salesforce作为数据存储的后端。这意味着除了用户之外,我的数据库中没有其他模型。我不能对rails使用传统的授权解决方案,因为它们要求我访问rails模型。

我正在构建的应用程序需要对用户有一定的权限。用户有两种状态: User:unactivated :activated

我将触发来自Salesforce的用户状态的更改。

我有需要根据用户状态进行保护的视图。我不确定处理这一问题的最可伸缩的方法是用户模型中的一个简单的状态列,并且在我的视图中只让<%= current_user.state ==“激活”%>,还是有更好的解决方案?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-28 03:50:56

在Rails 4.1中引入的Active Record的一个新特性Enum是实现您的需求的最简单方法。您可以实现一种非常基本的基于角色的授权形式,使用具有两种状态的单个角色“激活”。

创建一个迁移:

代码语言:javascript
复制
$ rails generate migration AddRoleToUsers role:integer

迁移将如下所示:

代码语言:javascript
复制
class AddRoleToUsers < ActiveRecord::Migration
  def change
    add_column :users, :role, :integer
  end
end

向用户模型中添加代码以实现Enum:

代码语言:javascript
复制
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属性,在激活和未激活值时,可以使用以下方法:

代码语言:javascript
复制
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

您可以在控制器中使用条件:

代码语言:javascript
复制
class UsersController < ApplicationController
  def index
    unless current_user.activated?
      redirect_to :back, :alert => "Access denied."
    end
    @users = User.all
  end
end

或者在视图中使用它:

代码语言:javascript
复制
<% if current_user.activated? %>
  <li><%= link_to 'Special Reports', some_path %></li>
<% end %>

通常,如果访问控制为控制器添加了大量代码,则建议您使用CanCanCan专家,因为您可以将复杂的授权逻辑移动到与控制器隔离的中心位置(“瘦控制器”)。但是,如果您的需求如您所描述的那么简单,则控制器中基于角色的授权是最优的。

我编写了一个Rails专家教程,它比较了两种方法,并提供了关于简单的基于角色的授权以及基于角色的权威授权的更多细节。

票数 2
EN

Stack Overflow用户

发布于 2014-06-27 22:28:41

您可以使用cancan (cancancan),有一个选项可以让您对控制器进行授权。

代码语言:javascript
复制
authorize_resource :class => false

你可以在他们的wiki 这里上读到更多这方面的内容,这是一个开始。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24461275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档