Спящий режим Grails Выбор объектов для сохранения, проблемы безопасности - PullRequest
0 голосов
/ 27 сентября 2019

Итак, я написал приложение Grails, и это прекрасно, как много работы он делает для вас.Благодаря автоматическому связыванию данных он отбрасывает множество объектов из базы данных, и все это так просто.

Но теперь, когда оно работает, я начинаю задумываться о его безопасности.Видите ли, у меня есть довольно сложная модель, которая содержит множество объектов различных типов, но только один из которых иногда необходимо сохранить.

Теоретически, кто-то может вручную создать HTML-страницу дляобмануть механизм привязки grails для обновления группы объектов в модели, которую они не имеют права обновлять.

Теперь я знаю, что grails позволяет вам указать, какие поля связаны.Но у меня действительно сложная и глубоко вложенная модель.Если бы мне пришлось везде указывать, какие поля можно связать, это было бы беспорядком.Кроме того, это разрушит приложение, потому что я ХОЧУ, чтобы эти объекты были связаны с моделью, я просто не хочу, чтобы пользователь обновлял их.Кроме того, некоторые из них являются коллекциями, и я пытаюсь понять, что может или не может быть связано в коллекции произвольного размера ... Я не вижу, чтобы это работало практически

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

Например,Вот метод контроллера Grails для обновления пароля пользователя:



     def personalUpdatePassword(AuthCommand m) {
            withSecurity(m, [], {
                User.withTransaction {
                    if (!m.personalC.validate()) {
                        m.personalC.personalButton = 'personalChangePasswordButton'
                        render(view: 'home', model: [m: m])
                        return
                    }
                    m.personalC.self.setRawPassword(m.personalC.rawPassword)
                    render(view: 'home', model: [m: m])
                }
            })
        }

Итак, AuthCommand - действительно сложная модель, которая связывает тонну вещей.Функция withSecurity гарантирует, что у них есть разрешение на обновление пароля для этого объекта.Но поскольку привязка данных Grails настолько мощна, теоретически она могла бы обновить кучу вещей в этой модели, которые они не имеют права обновлять.И поскольку эти объекты находятся сейчас в сеансе, когда транзакция заканчивается, эти мошеннические обновления также будут обновлены.

Что я хочу сделать, это просто сказать hibernate, хорошо, я только хочу сохранить измененияк объекту m.personalC.self.Что-нибудь еще в сеансе, игнорируйте.

Есть ли способ сделать это?

...