我在Ruby On Rails中开发了stateless
RESTful
API。它的工作方式是,当您登录时,您会收到一个令牌,然后您可以将其用作Authorization
标头来发出请求。
API中有两种不同的角色:管理员角色和客户角色。
我所做的是为路由添加一些角色约束,这样我可以根据特定角色指向控制器中不同方法的相同端点,如下所示(来自config / routes.rb):
get '/courses', to: 'courses#admin_index', constraints: admin_constraints
get '/courses', to: 'courses#client_index', constraints: client_constraints
。
约束是这样实现的:
admin_constraints = RoleRouteConstraint.new(User::ROLES[:admin])
client_constraints = RoleRouteConstraint.new(User::ROLES[:client])
当RoleRouteConstraint检索授权标头令牌所属的用户时,检查它的角色,如果角色与构造函数参数匹配,则返回true。
问题在于,当我切换角色时,Rails会以某种方式缓存我之前角色的Authorization标头。这意味着在我登录管理面板(作为管理员)后,与界面交互,然后进入客户端界面,执行一些操作,API将保持我的角色作为客户端。如果我然后尝试执行特定于管理员的操作,如下所示:
put '/courses/:id', to: 'courses#update', constraints: admin_constraints
我无法使用,因为API认为我仍然以客户端身份登录。问题是,如果我重新启动我的rails服务器它将工作。本地我正在使用POW,在暂存/生产中我正在使用apache2。因此,如果我执行Rails重新启动并以管理员身份重复请求,那么它将起作用。
有人有任何想法吗?