使用Shiro保护grails中的服务

使用Shiro保护grails中的服务,grails,groovy,service,soa,shiro,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 tr

我正在使用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插件是否支持这一点,但它确实支持,尽管是以“实验”的方式(不管这意味着什么)

更新

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

因此,要回答您关于是否可以使用筛选器保护服务的问题,答案是否定的,因为您只能从筛选器中访问控制器。然而,您可以使用Groovy元编程对服务执行AOP风格的方法拦截

基本方法是:

  • 对于每个服务,向元类添加一个
    invokeMethod
    属性
  • 此属性的值应为闭包。此闭包将拦截(即被调用而不是)服务上调用的每个方法
  • 这一关闭应该
    • 执行安全检查
    • 如果授权成功,则调用原始方法;如果授权失败,则引发异常(或显示错误)
旁白


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

谢谢。我用的是shiro,不是acegi。我想利用过滤来确保服务的安全。如果不清楚的话,很抱歉。谢谢你的建议。