Плагины Grails, требующие внешних связей - PullRequest
2 голосов
/ 11 марта 2011

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

Я подумываю написать плагин Grails, но этот плагин потребует какого-то отношения с учетной записью / объектом пользователя. Однако я не хочу навязывать конкретную модель безопасности плагину. Например, скажем, писал плагин системы комментариев (я не). У меня был бы объект комментария ...

class Comment  {
   String comment
   Date dateCreated
   // etc etc
}

В комментарии отсутствует пара вещей:

  1. Кто добавил комментарий
  2. К чему был добавлен комментарий.

Я бы хотел сначала сосредоточиться на # 1. Таким образом, кто-то может использовать плагин безопасности Spring и использовать объект Person по умолчанию, или, возможно, он изменил его на User. Кто знает. Может ли кто-нибудь придумать, как настроить эти отношения без жесткого кодирования в плагине?

Одна вещь, о которой я подумал, - это чтобы приложение grails расширило доменные классы плагина, чтобы добавить это отношение. так что я мог бы сделать что-то вроде ...

class ArticleComment extends Comment {
    static belongsTo = [user:User]
}

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

Ответы [ 2 ]

3 голосов
/ 11 марта 2011

Вы можете использовать ту же технику, что и плагин Commentable :

Пользователь вашего плагина должен объявить закрытие в Config.groovy для оценки зарегистрированного пользователя:

grails.myplugin.user.evaluator = { session.user }

И вы можете использовать что-то подобное в коде вашего плагина для вызова настроенного пользователем закрытия:

def evaluateUser() {
    def evaluator = grailsApplication.config.grails.myplugin.user.evaluator
    def user 
    if(evaluator instanceof Closure) {
        evaluator.delegate = this
        evaluator.resolveStrategy = Closure.DELEGATE_ONLY
        user = evaluator.call()
    }

    if(!user) {
        throw new Exception("No [grails.myplugin.user.evaluator] setting defined or the evaluator doesn't evaluate to an entity. Please define the evaluator correctly in grails-app/conf/Config.groovy")
    }
    if(!user.id) {
        throw new Exception("The evaluated user is not a persistent instance.")
    }
    return user
}
0 голосов
/ 11 марта 2011

Я думаю, что вы можете сделать это так, как SpringSecurity. Вместо того, чтобы позволить людям расширять ваш класс Comment, вы можете написать 2 class CommentUser & CommentPlace; тогда пусть другие их расширяют. Я думаю, что это проще.

...