使用Shiro保护grails中的服务

时间:2010-02-03 11:51:54

标签: grails groovy service soa 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()
      }
    } 
  } 
}

1 个答案:

答案 0 :(得分:3)

我不知道Shiro插件是否支持这个,但是Acegi plugin确实是这样,尽管是以“实验性”方式(无论这意味着什么)。

<强>更新

正确阅读了问题后,您似乎在询问是否可以使用过滤器来保护服务。如果是这种情况,那么Shiro有点无关紧要,因为它是执行授权的过滤器,而不是Shiro。

因此,要回答有关是否可以使用过滤器来保护服务的问题,答案是否定的,因为您只能从过滤器中访问控制器。但是,您可以使用Groovy元编程对服务执行AOP样式的方法拦截。

基本方法是:

  • 对于每项服务,将invokeMethod属性添加到MetaClass
  • 此属性的值应为Closure。该闭包将拦截(即调用而不是)在服务上调用的每个方法。
  • 此封闭应该
    • 执行安全检查
    • 如果授权成功,则调用原始方法,如果授权失败,则抛出异常(或显示错误)

<强>除了

如果可能的话,我强烈建议使用经过验证的安全插件(例如Shiro,Acegi)来执行授权检查,而不是按照上述方式自行滚动。