UI中的RESTful授权

时间:2014-03-17 21:00:41

标签: python ruby-on-rails authentication flask

我有两个独立的应用程序,一个API(使用Flask构建)和一个HTML / JS UI。

API处理身份验证和授权。身份验证已使用cookie正常运行。我在实施授权时遇到问题。

在UI中,如果用户经过身份验证但未获得授权,我想禁用某些HTML输入字段。我希望用户界面也知道用户是否未获得授权,因此可以禁用控件。用户可以查看值,但不能更新它们。现在,我的受保护路由已经运行授权检查,如果用户未获得授权,则返回401,但我也想让UI知道授权级别。

在包含API和UI的应用程序中,这可以轻松完成。例如,在带有CanCan的Rails中,可以执行:<% if can? :update, @article %>。但是,由于我的应用程序是两个独立的应用程序,我无法做到这一点。

由于我有两个单独的应用程序,我不能使用Flasks&#39; g会话。返回响应头是最好的方法吗?那是一个约定吗?基本身份验证令牌仅包含令牌而非授权级别,因此仅对身份验证有用。

1 个答案:

答案 0 :(得分:1)

这一切都取决于您需要什么类型的授权逻辑。您将需要一些JS对象,在下面的示例中,我创建了一个Ability对象,其构造函数有三个参数:user,car,company。

var Ability = function(user, car, company){
  this.user = user;
  this.car = car;
  this.company = company;
}

Ability.prototype.canSellCar = function(){
  return this.user.id == car.userId;
}

Ability.prototype.canWorkForCompany = function(){
   this.user.skills.forEach(function(skill, index){
     if(this.company.soughtSkills.indexOf(skill) !== undefined){
       return true
     }
   }
   return false;
}

然后你可以创建一个Ability对象的新实例,并在用户,汽车和公司的实例中传递它,就像这样

var bobs_abilities = new Ability(bob, truck, government)

最后,您可以调用您定义的能力原型的方法。

if(bobs_abilities.canSellCar){
  // UPDATE THE DOM TO SHOW THE UI ELEMENT THAT CONTROLS CAR SELLING
}

希望这对你来说是一个好的开始。您的能力类可能需要执行其他步骤,例如对服务器进行api调用以获取更多信息,或者您可能需要将参数传递给Ability原型中定义的函数。

如果您使用angular进行此操作,可能会将原型上的函数转换为自己的指令,以便您的html看起来像

<div can-sell-car user={{bob}} car={{truck}} company={{government}}>
  //Stuff you want to show in here
</div>

如果您想查看使用角度

,请务必查看https://egghead.io/