使用shiro在圣杯中获得服务
题
我正在使用Grails来构建一个主要作为服务框架的应用程序。我的问题是:可以与控制者一样的方式确保服务吗?
基于URI的示例:
class SecurityFilters {
def filters = {
all(uri: "/**") {
before = {
// Ignore direct views (e.g. the default main index page).
if (!controllerName) return true
// Access control by convention.
accessControl()
}
}
}
}
解决方案
我不知道Shiro插件是否支持此,但是 Acegi插件 确实,尽管以“实验性”的方式(无论是什么意思)。
更新
正确阅读了问题后,似乎您在问是否可以使用过滤器来保护服务。如果是这种情况,那么Shiro有些无关紧要,因为是执行授权的过滤器,而不是Shiro。
因此,要回答有关您是否可以使用过滤器来保护服务的问题,答案是否定的,因为您只能从过滤器中访问控制器。但是,您可以使用Groovy Metaprogramming对服务进行AOP型方法拦截。
基本方法是:
- 对于每种服务,添加
invokeMethod
属于Metaclass的财产 - 该属性的价值应该是关闭。此闭合将截取(即被调用)在服务上调用的每种方法。
- 这个关闭应该
- 执行安全检查
- 如果授权成功并提出异常(或显示错误),请调用原始方法
在旁边
如果可能的话,我强烈建议使用经过验证的安全插件(例如Shiro,Acegi)执行授权检查,而不是以上述方式滚动。
不隶属于 StackOverflow