如何让Shiro的注释在Grails中运行?

时间:2012-06-19 21:27:40

标签: grails shiro

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

彼得说here我们应该使用Shiro的注释而不是准弃用的grails-shiro插件注释。

如何才能实现这一目标?

我发现grail-shiro插件偏离了Shiro的处理方式,以及Realm转换的所有内容。有没有人试过直接实现Shiro而不是使用grails插件?有没有成功?

谢谢, 格雷厄姆。

2 个答案:

答案 0 :(得分:4)

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

  • 您可以在控制器中使用grails 2.x
  • 中的方法操作
  • 您可以在服务方法
  • 上使用它们
  • 他们目前不在服务上工作(我正在研究这个)

e.g。这适用于服务

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。

干杯, 彼得。

答案 1 :(得分:0)

因为没有人在唠叨......

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

当您需要权限显式角色时,您可以创建一些ShiroRole并为其分配星级权限:'book:*'允许角色执行书籍控制器上的所有操作。 'book:list,show'允许角色只列出或展示书籍。

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

当您需要使用gsp-code中的开关时(例如,仅当它是管理员时才显示),请使用shiro标签。只需解压缩shiro插件并查找taglibrary即可。这是有据可查的。

HTH