как реализовать Shiro Security of Grails в моем проекте

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

теперь я хочу внедрить Shiro Security. Я запустил этот плагин и приложение быстрого запуска Широ в новом проекте Grails.

чего я хочу добиться, так это того, как я могу реализовать свою безопасность на своих собственных страницах, используя файлы быстрого запуска и код. Пожалуйста, направляйте. маленький. какие файлы я должен использовать из этого быстрого запуска и какие изменения я должен внести. ?

жду положительного ответа :)


person Shah    schedule 28.04.2011    source источник


Ответы (1)


давайте сначала начнем со свежего приложения:

grails create-app ShiroDemo

Теперь установите shiroby, добавив его в раздел плагинов BuildConfig.groovy:

плагины {компилировать ":shiro:1.1.4" }

нам нужен контроллер авторизации и область подстановочных знаков:

grails create-auth-controller
grails create-wildcard-realm

теперь давайте создадим фиктивного пользователя с необходимой ролью и разрешениями в bootstrap.groovy:

import org.apache.shiro.crypto.hash.Sha256Hash
class BootStrap {
    def init = { servletContext ->
        def roleUser = new ShiroRole(name:'USER')
        roleUser.addToPermissions('auth:*')
        roleUser.addToPermissions('controller:action')
        roleUser.save(flush:true, failOnError: true)
        def testUser = new ShiroUser(username:'kermit',passwordHash:new Sha256Hash("password").toHex())
        testUser.addToRoles(roleUser)
        testUser.save(flush:true, failOnError: true)
    }
    def destroy = {
    }
}

Взгляните на строки role.User.addToPermissions. Здесь вы предоставляете разрешения своим контроллерам и действиям. Если у роли отсутствует разрешение, пользователь будет перенаправлен на страницу отказа в доступе. Вы найдете хорошее описание того, как указывать разрешения на странице подключаемого модуля shiro: http://www.grails.org/plugin/shiro Вам придется добавить дополнительные разрешения для остальных функций вашего приложения. Вы также можете добавить эти разрешения непосредственно пользователю — иногда это полезно для тестирования или если вы не хотите настраивать новую роль для чего-то особенного.

кстати: обязательно используйте sha256hash, а не sha1hash, который не будет работать с текущей версией shiro.

Последнее, что нам нужно сделать, это создать класс /conf/SecurityFilters.groovy:

class SecurityFilters {
    def filters = {
        all(uri: "/**") {
            before = {
                // Ignore direct views (e.g. the default main index page).
                if (!controllerName) return true

                // Access control by convention. 
                accessControl() 
            } 
        } 
    } 
}

Это установит контроль доступа для всех контроллеров, но не для прямого просмотра (наша индексная страница).

Теперь попробуйте и запустите свой проект:

grails run-app

надеюсь, это поможет!

person rdmueller    schedule 29.04.2011
comment
Дорогой Ральф. Конечно, для этого нам нужно добавить классы доменов пользователей и ролей. Не могли бы вы отредактировать контент для доменов пользователей и ролей. пожалуйста. :) а также, что мы должны создавать представления с помощью команды Grails generate-views? - person Shah; 29.04.2011
comment
пример завершен и работает - ShiroRole и ShiroUser генерируются операторами выше! - person rdmueller; 29.04.2011
comment
Уважаемый Ральф. Вы очень благодарны. Спасибо. Теперь я хочу, чтобы у меня уже был класс пользователя и роли, а также индексная страница. (Взгляды). у меня есть контроллер с именем UserController и есть действия входа и выхода. Теперь, как я могу применить эту безопасность в этом коде? - person Shah; 29.04.2011
comment
Если вам нужно управлять своими пользователями, вы можете создавать представления и контроллеры для ShiroUser и ShiroRole с помощью стандартных механизмов Grails (генерировать все). - person rdmueller; 29.04.2011
comment
Если вы хотите использовать свой собственный AuthController, просто взгляните на автоматически сгенерированный, скопируйте и вставьте код входа и выхода. К сожалению, расположение страницы входа жестко запрограммировано. Поэтому всякий раз, когда системе необходимо перенаправить на страницу входа, она будет перенаправляться на /auth/login — вы можете использовать UrlMappings для перенаправления на свой собственный контроллер. - person rdmueller; 29.04.2011
comment
Если вам нужно использовать свои классы User и Role, имеет смысл наследоваться от shiro (расширяет ShiroUser). Другой способ — просто добавить дополнительные свойства, необходимые для ShiroUser и Shiro Role. Если оба способа не подходят, думаю, достаточно переписать (поискать и заменить?) класс Realm. Здесь упоминаются ShiroUser и ShiroClass. - person rdmueller; 29.04.2011
comment
@Ralf, я попытался применить ваше решение, но при попытке войти в систему я получаю следующее сообщение об ошибке: groovy.lang.MissingMethodException: No signature of method: static ShiroUser.findByUsername() is applicable for argument types: (java.lang.String) values: [kermit]. Насколько я понимаю, добавление метода .findByXYZ() является одной из особенностей метапрограммирования Grails. У вас есть идеи, что здесь может пойти не так? - person mzuba; 25.09.2011
comment
ах, неважно, я обнаружил свою ошибку. Оказывается, это также связано с пакетами. - person mzuba; 25.09.2011