grails中的访问控制,角色和权限

时间:2011-12-21 03:16:42

标签: grails permissions roles access-control shiro

我第一次使用grails应用程序,现在我想保护一些只能由管理员查看的页面,并为其他用户提供一些权限。

我正在使用Apache Shiro插件来支持grails。

我在bootstrap中的示例代码如下所示

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()

        }
    }
}

}

我只想让“访客”访问库存脚手架。但是在我的应用程序中,一旦用户“Guest”登录就可以访问其他控制器,但我不希望这种情况发生。感谢您的帮助。

如果有更好的使用Shiro角色,访问控制和/或权限,请告诉我。

谢谢

1 个答案:

答案 0 :(得分:2)

行。让我们看看......

一开始就有拼写错误:

"Admin".isEmpty()

总是假的......我猜你没有“假”定义的角色......

您正在寻找“管理员”,但创建“管理员”......

做一个

adminRole.save(flush:true, failOnError:true)

而不是adminRole.save()。这将确保真正保存对象。

角色Administrator已拥有所有权限("*:*"),"admin"不是典型的shiro权限,因此您可以删除此行...(adminRole.addToPermissions("admin")

如果你做了

user.addToRoles(adminRole)

您无需添加"*:*"权限。这个角色已经足够了。

我现在已经创建了一个测试项目,安装了shiro,执行了create-auth-controllercreate-wildcard-realmcreate-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时,记录非常有用......