新手问题 Grape 的 before 没有 except 怎么解

birbird · 2015年07月17日 · 最后由 dy1901 回复于 2015年07月20日 · 4265 次阅读

API 需要鉴权,用 before,因为大部分 API 都需要鉴权,就写在根 API 文件上了,只用写一遍就好,简单。 但少数几个 API 又不需要鉴权,最理想的办法就像 rails 的 before_filter 一样,加个 except 就好了,但 Grape 的 before 没有 except。

在需要鉴权的 API 文件上加 before,不需要鉴权的不加 before,可以解决,但太多重复了。 在 before 里判断 path,放过不需要鉴权的 API 也是个办法,还是觉得不优雅。

请问有没有更好的办法?

可以加 namespace 把 api 分开

可以这样子

before do
  authenticate! if authenticate_required?
end

在定义 except 的情况

def authenticate_required?
end

#1 楼 @xxqfamous 那就要写很多个 namespace 了,也不爽

#2 楼 @justin 在根 API 类的 helper 里定义 authenticate_required? 为 true,在不需要鉴权的 API 类的 helper 里定义 authenticate_required? 为 false,是这样么

#4 楼 @birbird 不是这样的,假设before_filterexcept你想写什么,你就在authenticate_required?写什么 例如:

# if action is xxx then skip authenticate
def authenticate_required?
  !(request.url.match /xxx/)
end

如果是用namespace,直接

# if namespace is xxx then skip authenticate
def authenticate_required?
  namespace.match /xxx/
end

代码没试,你可以自己试试看。

#4 楼 @birbird 一般一个资源就是一个namespace 你也可以添加一个namespace都是不需要鉴权的

resources :users do 
  group do
     before do
      authenticate! 
     end
     ###需要鉴权的API
  end
  group do
    ###不需要鉴权的API 
  end
end

#3 楼 @birbird 不需要鉴权的 api 还需要多个 namespace?这样还谈什么优雅

写两套 api 就好:一套开放的不用鉴权,一套封闭的加 before filter 鉴权,只需要在 router 里面分别 mount 两个 api 的根文件,两套 api 就可以并行工作了。而且鉴权代码和不鉴权代码分开两个文件夹,代码安全性上也比较便于管理

需要 登录 后方可回复, 如果你还没有账号请 注册新账号