2010-04-29 12 views
7

Estoy trabajando en un proyecto que implica Spring Security ACL y encontré el permiso de creación BasePermission.CREATE. ¿Alguien podría explicar cómo se supone que funciona o qué le permite a alguien hacer?¿Alguien podría explicar Spring Security BasePermission.Create?

Tengo entendido que cada objeto tiene un acl, y cada acl tiene muchos as, y cada as tiene un sid y un permiso. ¿Cómo puede otorgar permiso a un objeto para crearlo, si debe crearse para adjuntarle el acl?

Respuesta

7

La seguridad de Spring otorga permisos a objetos de dominio indirectamente a través de la interfaz ObjectIdentity.

Como usted menciona, con mucho, el caso habitual es que se crea o se obtiene el objeto de dominio en primer lugar, y luego construir un ObjectIdentityImpl para el dominio del objeto:

MyDomainObject secured = new MyDomainObject(); 
ObjectIdentity securedIdentity = new ObjectIdentityImpl(secured); 

A continuación, utiliza la instancia ObjectIdentity para recuperar el ACL usando el marco de seguridad de primavera.

Sin embargo, esta no es la única forma de usar la identidad del objeto. Puede pasar una referencia a objectIdentity que no sea el objeto comercial real, pero tiene algún medio para identificarlo, si se creó.

Por ejemplo, imaginemos que queríamos proteger los archivos. Podríamos crear ObjectItentity con una instancia java.io.File que esté siendo protegida. El objeto File que está en la identidad es solo una referencia al archivo; no es el archivo real, es posible que el archivo ni siquiera exista, pero tenemos una ObjectIdentity que podemos razonar sobre la seguridad y buscar ACL.

Este patrón se puede aplicar a cualquier tipo de objeto de dominio. Cree una implementación de DomainObjectPrototype que describa el objeto de dominio en términos de las características de dominio necesarias para protegerlo, pero en realidad no necesita una referencia al objeto de dominio. Puedes pensar en esto como los detalles necesarios para que algún servicio realmente cree ese objeto de dominio.

PD: déjenme confesar que nunca he usado la seguridad de primavera, pero el patrón de diseño parece bastante claro después de mirar example.

EDITAR: He actualizado esto para, con suerte, hacerlo más claro: no es necesario crear implementaciones de ObjectIdentity como originalmente escribí.

+1

Gracias por su respuesta. Me gustaría aclarar sin embargo. ¿Quiere decir que si quiero restringir la creación de una clase de Widget, podría hacer algo como lo siguiente? ObjectIdentity securedIdentity = new ObjectIdentityImpl (Widget.class, Widget.RESERVED_CLASS_ID); Yo verificaría si el permiso de creación se permitió a algún sid. –

+1

Cuando el control de acceso no depende de las instancias específicas de la clase de Widget, puede hacerlo. Si necesita un control específico de instancia, cree una clase WidgetPrototype que incluya los atributos de dominio necesarios para definir el control de acceso. – mdma

0

Pensando en términos más generales, hay dos tipos de permisos: clase e instancia. La creación de objetos es un permiso de clase: tiene permiso para crear una nueva instancia. No tiene sentido cuando intentas aplicarlo a una instancia individual. El permiso de lectura puede ser cualquiera. Puede tener permiso para leer todas las instancias, o tal vez solo tiene permiso para leer un puñado de instancias enumeradas explícitamente.

Si alguna vez se siente confundido, piense en el clásico problema del "correo electrónico sorpresa de la fiesta de cumpleaños". Este es un correo electrónico de la oficina enviado a todos EXCEPTO el chico de cumpleaños para planificar la fiesta de cumpleaños sorpresa. En este caso, necesita una clase de permiso CREAR para crear y enviar el mensaje de correo electrónico, y todos tienen permiso de lectura de clase para leer el mensaje. Sin embargo, una persona tiene un permiso de DENY READ de instancia para que él, solo, no pueda leer el mensaje.

+0

Entiendo la necesidad de un permiso CREATE. Mi pregunta era cómo usarla en la seguridad de primavera específicamente. Gracias de cualquier forma. –

Cuestiones relacionadas