我正在使用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)执行授权检查,而不是以上述方式滚动。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top