我正在尝试将基于注释的安全性应用于我的 Grails 应用程序。
Peter在这里说我们应该使用 Shiro 的注解,而不是准弃用的 grails-shiro 插件注解。
一个人如何让它工作?
我发现 grails-shiro 插件偏离了 Shiro 的工作方式、领域转换的方式等等。有没有人尝试过直接实现 Shiro 而不是使用 grails 插件?有成功吗?
谢谢,格雷厄姆。
G'day 我已经接管了 Grails-Shiro 插件项目。我目前正在重新编写功能测试,并且可以确认 shiro 注释确实有效,但有几点需要注意:
例如,这适用于服务
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。
干杯,彼得。
既然没人接...
我不知道你是如何让注释工作的,但我在几个 Grails 项目中使用了 shiro 并且没有错过它们......那么你为什么需要它们?
当您需要授予显式角色权限时,您只需创建一些ShiroRole
s 并为它们分配星级权限:'book:*' 允许角色在 book 控制器上执行所有操作。'book:list,show' 允许角色仅列出或显示书籍。
当您需要隐式权限时,请使用过滤器。因此,如果您想授予某人访问权限(例如)某人的老板,只需在过滤器中获取您想要决定的对象并做出决定。
当您需要在 gsp 代码中切换时(例如,仅当它是管理员时才显示此内容),请使用 shiro 标记。只需解压缩 shiro 插件并查找 taglibrary。这是有据可查的。
高温高压