我有一个控制器使用@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对象为空。当我查看控制器中的参数时,controller
,action
和id
已设置。我在控制器中获得的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)
}
}
但这似乎是错误和脆弱的。还有更好的方法吗?