2011-12-21 114 views
2

我正在第一次使用Grails应用程序,现在我想保护一些页面只能被管理员查看,并给其他用户一些权限。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() 

// '用户' 目前已拥有管理员权限 }

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

     } 
    } 
} 

}

我想给“客人”访问库存只有脚手架。然而,在我的应用程序中,一旦用户“访客”登录到其能够访问其他控制器,但我不希望发生这种情况。我感谢您的帮助。

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

谢谢

回答

1

好的。让我们来看看......

没有在一开始一个错字:

"Admin".isEmpty() 

将永远是假的......我想你没有定义的角色“假” ......

而你正在寻找“管理”,而是创造“管理员” ......

做一个

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

代替adminRole.save()。这将确保该对象真正被保存。

作用Administrator已经拥有所有权限("*:*")和"admin"不是典型四郎许可,这样就可以把这个线...(adminRole.addToPermissions("admin")

如果你做一个

user.addToRoles(adminRole) 

您不需要添加"*:*"权限。角色已经足够了。

我现在已经创建了一个测试项目,安装了shiro,做了一个create-auth-controller,一个create-wildcard-realm和一个create-filters ShiroSecurity

通过将以下两行添加到Config中的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一起工作时,记录功能非常有用...