我正在尝试将基于注释的安全性应用于我的Grails应用程序。
彼得说here我们应该使用Shiro的注释而不是准弃用的grails-shiro插件注释。
如何才能实现这一目标?
我发现grail-shiro插件偏离了Shiro的处理方式,以及Realm转换的所有内容。有没有人试过直接实现Shiro而不是使用grails插件?有没有成功?
谢谢, 格雷厄姆。
答案 0 :(得分:4)
G'day我接管了Grails-Shiro插件项目。我目前正在重新编写功能测试,并且可以确认shiro注释是否有效,但需要注意几点:
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