3

私は初めてgrailsアプリケーションに取り組んでいますが、管理者だけが表示できるように一部のページを保護し、他のユーザーにいくつかの権限を付与したいと考えています。

grailsにApacheShiroプラグインを使用しています。

ブートストラップのサンプルコードは次のようになります

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

        }
    }
}

}

「ゲスト」に在庫スキャフォールドのみへのアクセスを許可したかったのです。ただし、私のアプリケーションでは、ユーザー「Guest」がログインすると、他のコントローラーにアクセスできるようになりますが、それが発生することは望ましくありません。私はあなたの助けに感謝します。

Shiroの役割、アクセス制御、および/または権限を使用する方が良い場合は、それについて知らせてください。

ありがとうございました

4

1 に答える 1

3

わかった。どれどれ...

最初にタイプミスがあります:

"Admin".isEmpty()

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

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

行う

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構成に次の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はコントローラーとアクションに基づいています...私の好みです...

しかし、あなたの問題は間違ったブートストラップにのみ基づいていたと思います。shiroで作業する場合、ロギングは非常に便利です...

于 2012-01-05T19:46:22.693 に答える