2010-02-03 93 views
1

我正在使用grails构建一个主要用作服务框架的应用程序。我的问题是:服务是否可以像控制器一样保护?使用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() 
     } 
    } 
    } 
} 

回答

3

我不知道如果四郎插件支持这一点,但Acegi plugin确实,尽管在“实验”的方式(知道是什么意思)。

更新

读过问题正确,似乎你问你是否可以使用筛选器安全服务。如果是这种情况,那么Shiro有点不相关,因为它是执行授权的过滤器,而不是Shiro。

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

的基本方法是:

  • 对于每一个服务,一个invokeMethod属性添加到元类
  • 此属性的值应该是一个封闭。这个闭包将拦截(即被调用,而不是)服务上调用的每个方法。
  • 这盖子应该
    • 执行安全检查
    • 调用原来的方法,如果认证成功,并抛出一个异常(或显示错误)如果授权失败

除了

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

+0

谢谢。我正在使用shiro,而不是acegi。我想利用过滤来保护服务。对不起,如果不明确。 – Brandon 2010-02-03 16:01:00

+0

谢谢你的意见。 – Brandon 2010-02-26 16:13:52