3

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

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

一个人如何让它工作?

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

谢谢,格雷厄姆。

4

2 回答 2

4

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。

干杯,彼得。

于 2013-09-16T06:05:32.450 回答
0

既然没人接...

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

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

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

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

高温高压

于 2012-06-25T08:00:18.377 回答