Выберите фильтр в раскрывающемся списке с помощью ACL безопасности Grails - PullRequest
0 голосов
/ 16 марта 2012

Я внедряю безопасность ACL с помощью плагина spring-security-acl. У меня есть следующие классы домена:

package test
class Subitem {

   String name

   static belongsTo = [employer: Employer]

   static constraints = {
    name blank: false
   }
}

package test
class Employer {
   String name

   static hasMany = [users: User, items: Subitem]
   static belongsTo = User

   static constraints = {
    name blank: false, unique: true
   }

   String toString() {
    name
   }
}

В файле create.gsp, который используется для создания подэлемента, есть следующий оператор:

<g:select id="employer" name="employer.id" from="${test.Employer.list()}" optionKey="id" required="" value="${subitemInstance?.employer?.id}" class="many-to-one"/>

От EmployerController:

    def list = {
    params.max = Math.min(params.max ? params.int('max') : 10, 100)
    [employerInstanceList: employerService.list(params),
     employerInstanceTotal: employerService.count()]
 }

Следуя указаниям, данным здесь , я перенес некоторые функции, связанные с взаимодействием с работодателем, в службу, называемую EmployerService:

@PreAuthorize("hasRole('ROLE_USER')")
@PostFilter("hasPermission(filterObject, read)")
List<Employer> list(Map params) {
   Employer.list params
}
int count() {
   Employer.count()
}

Доступ к информации в любом данном экземпляре класса Employer ограничен с помощью ACL. В настоящее время я могу видеть ВСЕ экземпляры Employer в базе данных в раскрывающемся списке, и я предполагаю, что это потому, что я использую список контроллеров (), а не список сервисов () - однако, я хочу видеть только отфильтрованный список классов доменов работодателей. Однако, если я заменю g: выберите:

<g:select id="employer" name="employer.id" from="${test.EmployerService.list()}" optionKey="id" required="" value="${subitemInstance?.employer?.id}" class="many-to-one"/>

тогда я получаю внутреннюю ошибку сервера, потому что я не передал параметр Map в функцию service list () (и я не знаю, как это сделать в теге):

URI /security/subitem/create
Class groovy.lang.MissingMethodException
Message No signature of method: static test.EmployerService.list() is applicable for argument types: () values: [] Possible solutions: list(java.util.Map), is(java.lang.Object), wait(), find(), wait(long), get(long)

Я хочу видеть только информацию, которая поступает из функции списка EmployerService () - как мне это сделать, пожалуйста? Как мне сослаться на правильную функцию из промежутка?

  • Редактировать 16 марта 0835: Спасибо @OverZealous, это действительно полезно, я этого не осознавал. Тем не менее, я попробовал это и все еще получаю ту же проблему. Я поместил оператор println () в функции Employer и EmployerService list () и вижу, что ни один из них не вызывается при анализе тега g: select (даже если я оставляю g: select для ссылки на Работодатель). Возможно, вызывается другая версия функции list ()? Или как еще получить g: select для учета ACL?

Ответы [ 2 ]

0 голосов
/ 16 марта 2012

ОК, я решил это, и вот решение для всех, кто сталкивается с той же проблемой.

Страница создания подэлемента отображается с помощью файла create.gsp Subitem и SubitemController.,Хитрость заключается в том, чтобы изменить SubitemController create () closure:

class SubitemController {

def employerService

def create() {
    // this line was the default supplied method:
    // [subitemInstance: new Subitem(params)]
    // so replace with the following:
    params.max = Math.min(params.max ? params.int('max') : 10, 100)
    [subitemInstance: new Subitem(params), employerInstanceList: employerService.list(params),
     employerInstanceTotal: employerService.count()]
    }
}

Так что теперь, когда SubitemController запрашивается g: select в представлении Subitem для списка работодателей,вызывает EmployerService, который предоставляет правильный ответ.Мы просто добавили еще 2 переменные, которые возвращаются в представление и на которые можно ссылаться в любом месте представления (например, с помощью тега g: select).

Урок для меня заключается в том, что представление взаимодействует сКонтроллер, который может ссылаться на Сервис: Сервис, кажется, не очень хорошо работает с View.

0 голосов
/ 16 марта 2012

Просто измените свою подпись метода в Сервисе, чтобы она выглядела следующим образом:

List<Employer> list(Map params = [:]) {
   Employer.list params
}

Изменение добавляет это: = [:].Это обеспечивает значение по умолчанию для params, в данном случае пустую карту.

(Кстати, это функция Groovy, кстати. Вы можете использовать ее в любом методе или замыкании, где аргументы необязательны, и выхочу указать значение по умолчанию.)

...