【问题标题】:How do I get Shiro's annotations to work in Grails?如何让 Shiro 的注释在 Grails 中工作?
【发布时间】:2023-03-15 13:16:02
【问题描述】:

我正在尝试将基于注释的安全性应用于我的 Grails 应用程序。

Peter 说 here 我们应该使用 Shiro 的注解,而不是准弃用的 grails-shiro 插件注解。

如何让它发挥作用?

我发现 grails-shiro 插件偏离了 Shiro 的工作方式、Realm 转换等。有没有人尝试过直接实现 Shiro 而不是使用 grails 插件?成功了吗?

谢谢, 格雷厄姆。

【问题讨论】:

  • 因此,只要您在 Config.groovy 中启用了注释,它们似乎确实可以开箱即用。也就是说,它们似乎不适用于 Controller 中的方法,包括操作(当声明为 Grails 2.0+ 的方法而不是闭包时)。还在调查中……

标签: grails shiro


【解决方案1】:

G'day 我已经接管了 Grails-Shiro 插件项目。我目前正在重新编写功能测试,并且可以确认 shiro 注释确实有效,但有几点需要注意:

  • 您可以在控制器中将它们用于 grails 2.x 中的方法操作
  • 您可以在服务方法上使用它们
  • 他们目前不处理服务(我正在调查这个)

例如这适用于服务

class SecuredMethodsService {

def methodOne() {
    return 'one'
}

@RequiresGuest
def methodTwo() {
    return 'two'
}

@RequiresUser
def methodThree() {
    return 'three'
}

@RequiresAuthentication
def methodFour() {
    return 'four'
}

@RequiresRoles('User')
def methodFive() {
    return 'five'
}

@RequiresPermissions("book:view")
def methodSix() {
    return 'six'
}

}

或在控制器中的操作方法上,如下所示:

    @RequiresAuthentication
def unrestricted() {
    render(view: 'simple', model: [msg: "secure action"])
}

当使用注解时,您可能需要添加一个“afterView”过滤器来捕获注解抛出的 AuthorizationException,例如

class ShiroSecurityFilters {
def filters = {
    all(uri: "/**") {
        before = {
            // Ignore direct views (e.g. the default main index page).
            if (!controllerName) return true
            // Access control by convention.
            accessControl()
        }
        afterView = { e ->
            while (e && !(e instanceof AuthorizationException)) {
                e = e.cause
            }

            if (e instanceof AuthorizationException) {
                if (e instanceof UnauthenticatedException) {
                    // User is not authenticated, so redirect to the login page.
                    flash.message = "You need to be logged in to continue."
                    redirect(
                            controller: 'auth',
                            action: 'login',
                            params: [targetUri: request.forwardURI - request.contextPath])
                } else {
                    redirect(controller: 'auth', action: 'unauthorized')
                }
            }

        }
    }
}

}

我希望这会有所帮助。应该发布新版本的插件RSN。

干杯, 彼得。

【讨论】:

  • 它是否需要任何额外的配置,或者它应该默认启用,并且只要我在控制器操作方法上添加注释就会开始
  • 看起来 ShiroGrailsPlugin.groovy 中与注释相关的旧代码(processController 和 processAnnotations)已经死了,不再有用,我看不到 controllerClass.roleMap 或 PermissionMap 在任何地方使用。 shiro 插件是否仍然支持自定义注释,RoleRequired 和 PermissionRequired,以及控制器内部的 accessControl 构建器!看起来那段代码毫无用处!
  • 该代码已被弃用,这意味着人们使用它并且它可以工作,所以它不是没用的。将来可能会被删除。
  • ShiroGrailsPlugin.groovy 中的代码死了 processController/processAnnotations 是不是在任何地方都在使用 controllerClass.roleMap 或 PermissionMap !!不过我可能会遗漏一些东西。
  • 使用标准注释。只需查看此处的新测试示例github.com/pledbrook/grails-shiro/tree/master/test/projects/… 将其添加到配置中...不,您不需要角色映射或权限映射,这一切都在过滤器中完成。安全 { shiro { authc.required = false annotationdriven.enabled = true } }
【解决方案2】:

既然没有人回答...

我不知道你是如何让注释工作的,但我在几个 Grails 项目中使用过 shiro 并且没有错过它们……那你为什么需要它们?

当您需要显式授予角色权限时,您只需创建一些ShiroRoles 并为它们分配星号权限:'book:*' 允许角色在 book 控制器上执行所有操作。 'book:list,show' 允许角色仅列出或显示书籍。

当您需要隐式权限时,请使用过滤器。因此,如果您想授予某人访问权限(例如)某人的老板,只需在过滤器中获取您想要决定的对象并做出决定。

当您需要在 gsp 代码中进行切换时(例如,仅当它是管理员时才显示此内容),请使用 shiro 标记。只需解压缩 shiro 插件并查找 taglibrary。这是有据可查的。

HTH

【讨论】:

  • 如果您使用 Shiro 插件的“安全性惯例”,那就太好了 - 即:controller:action - 但不处理任何地方的资源安全问题else 比这里范例。如何保护服务、实用程序或其他任何东西。这是 AOP/Annotations 的最佳选择,而且 Shiro 插件似乎没有处理。
  • 我认为这是因为 grails 并非旨在建立“内部”安全性。您通过访问控制器来访问服务:操作 - 这就是插件保护的内容 - 它从外部保护您的 grails 应用程序......
  • 嗯,我想我已经让 Shiro 的本机注释适用于非控制器方法。他们为什么不能在控制器方法上工作是有原因的吗?
  • Ralf,除了最基本的 Web 应用程序之外,Shiro 插件的“安全性惯例”是不够的。如果它至少不支持Shiro 提供的大多数 功能,则不应声称它是“Shiro 插件”。也就是说,我认为我已经缩小了注释与控制器中方法的不兼容性;他们在服务业和其他地方工作。看来不兼容只存在于控制器上。
  • 那么,你会自己回答你的问题,以便我明白你的意思吗?
猜你喜欢
  • 2012-04-27
  • 1970-01-01
  • 2015-01-20
  • 2018-05-12
  • 2013-07-22
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多