Добрый день есть проект на GRAILS в котором используются PreInsertEventListener, PreUpdateEventListener... и hibernate filters для обеспечения безопасности доступа к отдельной записи (acl). код имеется примерно следующий:
| Код | ...... public static final int METHOD_READ= 1 public static final int METHOD_UPDATE= 2 ...... public boolean onPreUpdate(PreUpdateEvent event) { // acl накладывается только на некоторые классы if (!needClassNames.contains(event.entity.class.name)) return false;
Session session = ....//get current session Filter filter = session.getEnabledFilter(getFilterName(event.entity.class.name)) filter.setParameter('method', METHOD_UPDATE) ArrayList list = Book.executeQuery("select s.id from "+event.entity.class.name+" s where s.id = ?)", [event.entity.id]) //Book - произвольный доменный класс, не совпадает с event.entity.class, так как event.entity.class может быть разным //работает это следующим образом - перед выполнением запроса на это все накладывается hibernate фильтр в котором и прописана логика //если у текущего пользователя нет прав на объект event.entity с действием METHOD_UPDATE - то в результате фильтра вернется 0 записей return (list == null || list.size() == 0) }
|
однако есть проблема - при выполнении строки Book.executeQuery снова вызывается onPreUpdate по тому же самому entity и в итоге все падает с stack overflow exception, потому как рекурсия получается бесконечной. пока поставил костыль, чтобы на повторные вызовы по тому же объекту сразу возвращать false. но хотелось бы нормально решить. |