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

标签 grails permissions roles access-control shiro

我是第一次开发 grails 应用程序,现在我想保护某些页面只能由管理员查看,并授予其他用户一些权限。

我正在使用 grails 的 Apache Shiro 插件。

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

//“用户”现在拥有所有管理员权限 }

    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”登录,它就能够访问其他 Controller ,但我不希望这种情况发生。感谢您的帮助。

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

谢谢

最佳答案

好的。让我们看看...

开头有一个错字:

"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-过滤器 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 基于 Controller 和操作...只是我的偏好...

但我猜你的问题只是基于错误的 Bootstrap 。当您使用 shiro 时,日志记录非常有用...

关于grails - grails 中的访问控制、角色和权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8584671/

相关文章:

email - 在 heroku 上运行 Grails 应用程序的 javax.mail 异常

cocoa - Cocoa 中读取文件权限

C# - 无法访问所有文件

ios - iOS更新拒绝-位置权限模式警报

.net - 如何在我的应用程序的 azure ad 中添加角色?

grails - 如何在 groovy 线程中使用 session

java - 如果我更改 grails 域中的字段名称会怎样?

grails - 使用Grails + PostgreSQL-如何调试GORM?

java - 使用 Spring Security RoleHierarchy 时拒绝访问

sql - 如何正确定义角色和权限(案例研究 - PostgreSQL)?