使用 Shiro 保护 grails 中的服务

发布于 2024-08-20 19:46:50 字数 388 浏览 9 评论 0原文

我正在使用 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()
      }
    } 
  } 
}

I'm using grails to build an application that functions primarily as a service framework. My question is: Can services be secured in the same fashion as controllers?

uri-based example:

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()
      }
    } 
  } 
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

幸福丶如此 2024-08-27 19:46:50

我不知道 Shiro 插件是否支持此功能,但是 Acegi 插件< /a> 确实如此,尽管是以“实验”方式(无论这意味着什么)。

更新

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

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

基本方法是:

  • 对于每个服务,向 MetaClass 添加一个 invokeMethod 属性。
  • 该属性的值应该是一个 Closure。这个闭包将拦截(即被调用)服务上调用的每个方法。
  • 这个关闭应该
    • 执行安全检查
    • 授权成功则调用原方法,授权失败则抛出异常(或显示错误)

旁白

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

I've no idea if the Shiro plugin supports this, but the Acegi plugin does, albeit in an "experimental" fashion (whatever that means).

Update

Having read the question properly, it seems you're asking whether you can use filters to secure services. If this is the case, then Shiro is somewhat irrelevant, because it's the filters that are performing authorisation, not Shiro.

So to answer your question about whether you can use filters to secure services, the answer is no, because you only have access to the controller from within a filter. However, you could use Groovy metaprogramming to do AOP-style method interception on services.

The basic approach is:

  • For each service, add an invokeMethod property to the MetaClass
  • The value of this property should be a Closure. This closure will intercept (i.e. be called instead of) each method called on the service.
  • This closure should
    • Perform the security checks
    • Invoke the original method if authorization is successful and throw an exception (or show an error) if authorization fails

Aside

If at all possible, I would strongly recommend using a proven security plugin (e.g. Shiro, Acegi) to perform the authorization checks rather than rolling your own in the manner described above.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文