security - trackid - tag manager google analytics
Seguridad(también conocido como Permisos) y Lucene-¿Cómo? ¿Debe hacerse? (4)
Como mencionó Yuval, podría valer la pena tener el mecanismo de permiso independiente del índice de Lucene.
Una forma de hacerlo es implementar su propio Collector
, que filtrará los resultados a los que el usuario no debería tener acceso.
Primero algunos antecedentes de mi pregunta.
- Las entidades individuales pueden tener permisos de lectura.
- Si un usuario falla una verificación de permiso de lectura , no puede ver esa instancia.
El problema se relaciona con presentar a Lucene y realizar una búsqueda que simplemente devuelve una lista de instancias de entidades coincidentes. Mi código tendría que filtrar las entidades una por una. Este enfoque es extremadamente ineficiente ya que existe la situación de que un usuario solo puede ver a una pequeña minoría y verificar que muchos devuelvan algunos no es lo ideal.
¿Qué enfoques o cómo los desarrolladores resolverían este problema, teniendo en cuenta que la indexación y las búsquedas se realizan con Lucene?
EDITAR
Definiciones
- Un usuario puede pertenecer a muchos grupos.
- Un rol puede tener muchos grupos, estos pueden cambiar.
- Un permiso tiene un rol - (direccionamiento indirecto).
- X puede tener un permiso de lectura.
- Es posible que la definición de un rol cambie en cualquier momento.
Indexación
- Agregar el conjunto de Grupos (expandir un Permiso) en el momento del índice puede hacer que la definición quede desincronizada cuando cambie la lista de grupos de miembros para un Rol.
- Espero evitar tener que reindexar X siempre que cambie la definición de Permiso / Rol.
Control de seguridad
- Para pasar una verificación de Permiso, un Usuario debe pertenecer a un grupo que está dentro del conjunto de grupos que pertenecen a la Función para un Permiso dado.
Depende de la cantidad de diferentes grupos de seguridad que sean relevantes en su contexto y de cómo la seguridad se aplica a sus datos indexados.
Tuvimos un problema similar que resolvimos de la siguiente manera: al indexar agregamos los grupos permitidos al documento y al buscar agregamos una consulta booleana con los grupos de los que el usuario era miembro. Eso funcionó bien en nuestro escenario.
Depende de tu modelo de seguridad. Si los permisos son simples (digamos que tiene tres clases de documentos), probablemente sea mejor crear un índice de Lucene por clase y combinar los resultados cuando un usuario pueda ver más de una clase. El Wiki de seguridad de Solr sugiere algo similar a la sugerencia de HakonB: agregar las credenciales del usuario a la consulta y buscarlas. Véase también esta discusión en el grupo de usuarios de Lucene . Otra estrategia será envolver la búsqueda de Lucene con una clase de seguridad independiente que realice un filtrado adicional de Lucene. Puede ser más rápido si puede hacerlo utilizando una base de datos para los permisos.
Edit: veo que tienes un sistema de permisos bastante complejo. Su elección de diseño básico es si implementarlo dentro de Lucene o fuera de Lucene. Mi consejo es usar a Lucene como motor de búsqueda (su principal fortaleza) y usar otro sistema / aplicación para seguridad. De todos modos, si elige usar Lucene por seguridad, le sugiero que aprenda sobre los filtros de Lucene y utilice un filtro de bits para filtrar los resultados de una consulta. Tiene los problemas que enumeró de tener que mantener actualizados los permisos.
Lo que sugeriría es tener dos tipos de documentos:
1) Real_documents con un campo llamado: "DocumentID"
2) Un documento de seguridad con campos: "Role" "Grupos" "Usuarios" "PermisionId" "DocumentsIds"
entonces un pseudocódigo podría ser:
Field[] docIds =searcher.search("Users", "currentUser").getFields("DocumentIds");
TermsFilter filter = new TermFilter();
foreach(field:docIDs){
filter.add(new Term(field.field(),field.text());
}
searcher.search(query.getWeight(searcher), filter, numberOfDocuments);
Siendo que Lucene es muy rápida en la búsqueda, dos búsquedas son realmente fáciles de hacer. De esta manera usted también tiene un mejor tf-idf por usuario.