Я внедряю безопасность 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?