контроль доступа, роль и разрешение в grails

Я впервые работаю над приложением grails, и теперь я хочу защитить некоторые страницы, чтобы их могли просматривать только администраторы, и дать некоторые разрешения другим пользователям.

Я использую плагин Apache Shiro для grails.

Мой пример кода в начальной загрузке выглядит так

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

        }
    }
}

}

Я хотел предоставить «гостю» доступ только к леску инвентаря. Однако в моем приложении, когда пользователь «Гость» вошел в систему, он может получить доступ к другим контроллерам, но я не хочу, чтобы это произошло. Я ценю вашу помощь.

Если есть возможность лучше использовать роль Широ, контроль доступа и / или разрешения, пожалуйста, дайте мне знать об этом.

Спасибо


person WowBow    schedule 21.12.2011    source источник


Ответы (1)


В ПОРЯДКЕ. Посмотрим...

в самом начале есть опечатка:

"Admin".isEmpty()

всегда будет ложным ... и я предполагаю, что у вас не определена роль "ложь" ...

И вы ищете "Админ", а создаете "Администратора" ...

Do a

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

вместо adminRole.save(). Это гарантирует, что объект действительно сохранен.

Роль Administrator уже имеет все разрешения ("*:*"), а "admin" не является типичным разрешением shiro, поэтому вы можете опустить эту строку ... (adminRole.addToPermissions("admin"))

Если вы сделаете

user.addToRoles(adminRole)

вам не нужно добавлять "*:*"permission. Роли уже хватит.

Теперь я создал тестовый проект, установил shiro, выполнил create-auth-controller, create-wildcard-realm и create-filters ShiroSecurity.

Активируйте ведение журнала для BootStrap и Shiro-Realm, добавив следующие две строки в конфигурацию log4j в Config.groovy:

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

        }
    }
}

и это работает ...

Как видите, мои фильтры безопасности основаны на контроллере и действии ... просто мои предпочтения ...

Но я предполагаю, что ваша проблема была основана только на неправильной загрузке. Ведение журнала очень полезно, когда вы работаете с Сиро ...

person rdmueller    schedule 05.01.2012