2011-12-21 45 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一起工作時,記錄功能非常有用...