我有两个独立的应用程序,一个API(使用Flask构建)和一个HTML / JS UI。
API处理身份验证和授权。身份验证已使用cookie正常运行。我在实施授权时遇到问题。
在UI中,如果用户经过身份验证但未获得授权,我想禁用某些HTML输入字段。我希望用户界面也知道用户是否未获得授权,因此可以禁用控件。用户可以查看值,但不能更新它们。现在,我的受保护路由已经运行授权检查,如果用户未获得授权,则返回401,但我也想让UI知道授权级别。
在包含API和UI的应用程序中,这可以轻松完成。例如,在带有CanCan的Rails中,可以执行:<% if can? :update, @article %>
。但是,由于我的应用程序是两个独立的应用程序,我无法做到这一点。
由于我有两个单独的应用程序,我不能使用Flasks&#39; g
会话。返回响应头是最好的方法吗?那是一个约定吗?基本身份验证令牌仅包含令牌而非授权级别,因此仅对身份验证有用。
答案 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/