Я работаю над проектом, который включает безопасность Spring ACL, и я столкнулся с создать разрешением BasePermission.CREATE
. Кто-то объяснил бы, как это, как предполагается, работает или что это позволяет кому-то делать?
Это - мое понимание, что каждый объект имеет acl, и каждый acl имеет многих туз, и каждый туз имеет sid и разрешение. Как можно дать разрешение на объекте создать его, если это должно быть создано для присоединения acl к нему?
Безопасность Spring предоставляет разрешения для объектов домена косвенно через интерфейс ObjectIdentity .
Как вы упомянули, в большинстве случаев вы сначала создаете или получаете объект домена, а затем конструируете ObjectIdentityImpl
для объекта домена:
MyDomainObject secured = new MyDomainObject();
ObjectIdentity securedIdentity = new ObjectIdentityImpl(secured);
Затем вы используете ObjectIdentity
для получения ACL с помощью инфраструктуры безопасности Spring.
Однако это не единственный способ использовать идентификацию объекта. Вы можете передать ссылку на objectIdentity, которая не является фактическим бизнес-объектом, но имеет некоторые средства его идентификации, если он был создан.
Например, представьте, что мы хотим защитить файлы. Мы могли бы создать ObjectItentity с защищаемым экземпляром java.io.File
. Объект File
, который находится в идентификаторе, является только ссылкой на файл - это не фактический файл - файл может даже не существовать, но у нас есть ObjectIdentity, который мы можем затем рассуждать о безопасности и получать списки управления доступом. для.
Этот шаблон можно применить к любому типу объекта домена. Создайте реализацию DomainObjectPrototype
, которая описывает объект домена с точки зрения функций домена, необходимых для его защиты, но на самом деле не требует ссылки на объект домена.Вы можете думать об этом как о деталях, необходимых для того, чтобы какая-то служба на самом деле создала этот объект домена.
PS: позвольте мне признаться, что я никогда не использовал Spring Security, но шаблон проектирования кажется мне довольно ясным после просмотра примера .
РЕДАКТИРОВАТЬ: Я обновил это, чтобы, надеюсь, прояснить - нет необходимости создавать реализации ObjectIdentity, как я писал изначально.
В более широком смысле существует два типа разрешений: класс и экземпляр. Создание объекта - это разрешение класса - у вас есть разрешение на создание нового экземпляра. Это бессмысленно, когда вы пытаетесь применить его к отдельному экземпляру. Разрешение на чтение может быть любым. У вас может быть разрешение на чтение всех экземпляров, или, может быть, у вас есть разрешение только на чтение нескольких явно перечисленных экземпляров.
Если вы когда-нибудь запутались, подумайте о классической проблеме «письмо-сюрприз на день рождения». Это служебное электронное письмо, отправленное всем, КРОМЕ именинника, чтобы спланировать вечеринку-сюрприз. В этом случае вам нужно разрешение класса CREATE для создания и отправки сообщения электронной почты, и у всех есть разрешение класса READ для чтения сообщения. Однако у одного человека есть разрешение DENY READ на экземпляр, чтобы он один не мог прочитать сообщение.