当从URL中提取id时,如何访问@Secured()表达式中的id参数

时间:2015-05-28 15:34:32

标签: grails spring-security

我有一个控制器使用@Secured()根据正在处理的特定域对象限制对操作的访问:

@Secured('@permissionChecker.isLocationAdmin()')
public edit(Location location) {
  // [code]
}

基于a previous answer,我知道我无法将位置对象传递给权限检查程序。使用建议的解决方法时(在permissionChecker.isLocationAdmin代码中),

import org.springframework.web.context.request.RequestContextHolder
...
def params = RequestContextHolder.requestAttributes.params

我可以访问id参数如果我使用网址https://.../edit?id=42

但是,如果我使用https://.../edit/42,则params对象为空。当我查看控制器中的参数时,controlleractionid已设置。我在控制器中获得的params对象也不一样(根据调试器)。

我的UrlMappings很简单,有相关条目:

"/$controller/$action?/$id?"{
  constraints {
    // apply constraints here
  }
}

到目前为止似乎有用的是手动将id从网址中拉出来:

def params = RequestContextHolder.requestAttributes.params
String idStr = params.id
if (!idStr) {
  String url = ((ServletRequestAttributes) RequestContextHolder.requestAttributes).request.getRequestURI()
  int idx = url.lastIndexOf('/')
  if (url &&  idx >= 0) {
    idStr = url.substring(idx + 1)
  }
}

但这似乎是错误和脆弱的。还有更好的方法吗?

0 个答案:

没有答案