【问题标题】:access control, role and permission in grailsgrails中的访问控制、角色和权限
【发布时间】:2023-04-06 07:59:02
【问题描述】:

我是第一次开发 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 角色、访问控制和/或权限,请告诉我。

谢谢

【问题讨论】:

    标签: grails permissions roles access-control 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 时,日志记录非常有用...

    【讨论】:

      猜你喜欢
      • 2014-01-25
      • 2021-02-21
      • 2014-11-30
      • 2013-01-25
      • 1970-01-01
      • 2020-06-22
      • 2012-10-25
      • 2019-05-17
      • 2015-04-10
      相关资源
      最近更新 更多