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í.
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. –
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