grails中的访问控制、角色和权限
Posted
技术标签:
【中文标题】grails中的访问控制、角色和权限【英文标题】:access control, role and permission in grails 【发布时间】:2012-01-24 23:03:50 【问题描述】:我是第一次开发 grails 应用程序,现在我想保护一些页面仅供管理员查看,并授予其他用户一些权限。
我正在为 grails 使用 Apache Shiro 插件。
我在引导程序中的示例代码如下所示
class BootStrap
def init = servletContext ->
def adminRole
if(ShiroRole.findByName("Admin".isEmpty()))
adminRole = new ShiroRole(name: "Administrator")
adminRole.addToPermissions("*:*")
adminRole.addToPermissions("admin")
adminRole.save()
// 'user' 现在拥有所有管理员权限
if (ShiroUser.findAllByUsername("user").isEmpty())
def user = new ShiroUser(username: "user", passwordHash: new Sha256Hash("pass").toHex())
user.addToPermissions("*:*")
user.addToRoles(adminRole)
user.save()
if (ShiroUser.findAllByUsername("Guest").isEmpty())
def user = new ShiroUser(username: "Guest", passwordHash: new Sha256Hash("pass").toHex())
user.addToPermissions("inventory:*")
user.save()
def destroy =
我的 ShiroSecurityFilters 看起来像
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()
我只想让“来宾”访问 inventory 脚手架。然而,在我的应用程序中,一旦用户“Guest”登录它就可以访问其他控制器,但我不希望这种情况发生。感谢您的帮助。
如果有更好的使用 Shiro 角色、访问控制和/或权限,请告诉我。
谢谢
【问题讨论】:
【参考方案1】:好的。让我们看看...
开头有错别字:
"Admin".isEmpty()
将永远是假的......我猜你没有定义角色“假”......
您正在寻找“管理员”但创建“管理员”...
做一个
adminRole.save(flush:true, failOnError:true)
而不是adminRole.save()
。这将确保对象真正被保存。
角色Administrator
已经拥有所有权限("*:*"
),而"admin"
不是典型的shiro权限,所以你可以去掉这行...(adminRole.addToPermissions("admin")
)
如果你做一个
user.addToRoles(adminRole)
您无需添加"*:*"
权限。角色已经够了。
我现在创建了一个测试项目,安装了 shiro,做了一个create-auth-controller
、一个create-wildcard-realm
和一个create-filters ShiroSecurity
。
通过在 Config.groovy 中的 log4j 配置中添加以下两行来激活 BootStrap 和 Shiro-Realm 的日志记录:
debug 'grails.app.conf.BootStrap'
debug 'grails.app.realm'
这是我的 BootStrap.groovy:(有趣的部分)
def init = servletContext ->
def adminRole
if(ShiroRole.findByName("Administrator")==null)
adminRole = new ShiroRole(name: "Administrator")
adminRole.addToPermissions("*:*")
adminRole.save(flush:true, failOnError:true)
log.debug adminRole.dump()
println ShiroUser.findAllByUsername("user").dump()
log.debug "="*80
if (ShiroUser.findAllByUsername("user").isEmpty())
def user = new ShiroUser(username: "user", passwordHash: new Sha256Hash("pass").toHex())
user.addToRoles(adminRole)
user.save(flush:true, failOnError:true)
log.debug user.dump()
if (ShiroUser.findAllByUsername("Guest").isEmpty())
def user = new ShiroUser(username: "Guest", passwordHash: new Sha256Hash("pass").toHex())
user.addToPermissions("inventory:*")
user.save(flush:true, failOnError:true)
log.debug user.dump()
还有我的 ShiroSecurityFilters.groovy:
def filters =
all(controller:'*', action:'*')
before =
// Ignore direct views (e.g. the default main index page).
if (!controllerName) return true
// Access control by convention.
accessControl()
它可以工作......
如您所见,我的 SecurityFilters 基于控制器和操作...只是我的偏好...
但我猜你的问题只是基于错误的引导程序。使用 shiro 时,日志记录非常有用...
【讨论】:
以上是关于grails中的访问控制、角色和权限的主要内容,如果未能解决你的问题,请参考以下文章
Grails Spring Security UI、用户和角色管理访问
[SpringSecurity]web权限方案_用户授权_基于权限访问控制_基于角色访问控制_hasAuthority和hasAnyAuthority_hasRole和hasAnyRole