2011-12-21 6 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() 

     } 
    } 
} 

}

足場にのみ「ゲスト」アクセスを許可したいと思います。しかし、私のアプリケーションでは、一度ユーザー "Guest"がログインして他のコントローラにアクセスできますが、そのようなことは起こりたくありません。私はあなたの助けに感謝します。

城の役割、アクセス制御、アクセス許可の方が良い場合は、私に知らせてください。

ありがとうございました

答えて

1

OKです。右の開始時にタイプミスがあり

...見てみましょう:...

"Admin".isEmpty() 

は常にfalseになりますが...と私はあなたが定義された「偽」何の役割も持っていないと思い

そして、あなたは「管理者」を探していますが、「管理者」を作成している...

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

の代わりに、を行います。これは、オブジェクトが実際に保存されていることを確認します。あなたは

user.addToRoles(adminRole) 

を行う場合(adminRole.addToPermissions("admin")

...

役割Administratorはすでに("*:*"を)すべての権限を持っていると"admin"は、典型的な史郎のアクセス許可ではありませんので、あなたは、この行をドロップすることができます"*:*"権限を追加する必要はありません。役割はすでに十分です。

私は今、shiroをインストールしたテストプロジェクトを作成しました。create-auth-controllercreate-wildcard-realmcreate-filters ShiroSecurityでした。

Configのlog4j設定に次の2行を追加して、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はコントローラとアクションに基づいています...私の好みです...

あなたの問題は間違ったブートストラップだけに基づいていたと思います。ロギングは非常に便利です...

関連する問題