Introducción
El asistente ya está limitado a documents.read, pero una herramienta permitida todavía puede solicitar un documento prohibido. Mantienes una instancia nueva cuya política de objetos permite actualmente todas las lecturas.
Añade una pequeña regla Python en dos etapas: protege la propiedad y después conserva el acceso compartido explícito. El servidor obtiene la identidad de sesiones autenticadas, no de argumentos propuestos. Todos los documentos son sintéticos y las propuestas son reproducciones declaradas; las lecturas y la autorización son reales. Solo necesitas las habilidades de terminal anteriores; aquí se explica la sintaxis Python.
Vincular las lecturas al propietario autenticado
Selecciona la pestaña Test Client en la interfaz del laboratorio para comenzar este paso.
En este paso, impide que una herramienta permitida acceda al documento privado de otro usuario.
Utiliza esta tabla. owner y shared_with son campos almacenados del documento, no valores de una propuesta.
| Documento | Propietario | Compartido con | Alice puede leer | Bob puede leer |
|---|---|---|---|---|
alice-notes |
alice |
nadie | sí | no |
bob-notes |
bob |
nadie | no | sí |
team-plan |
bob |
alice |
sí | sí |
En la pestaña Test Client, --as bob selecciona la credencial autenticada preparada de Bob. Omitirlo selecciona Alice. Confirma primero una lectura normal del propietario:
Cambia a la pestaña Test Client antes de ejecutar el siguiente comando.
assistant call documents.read alice-notes
Espera HTTP 200 y el contenido de Alice. Reproduce ahora la ausencia de control de objeto:
assistant call documents.read bob-notes
Devuelve incorrectamente HTTP 200 y Synthetic Bob private budget. No se utiliza información privada real. La lista de herramientas por sí sola no protegió el objeto.
En la pestaña Policy Editor, examina la política pequeña:
Cambia a la pestaña Policy Editor antes de ejecutar el siguiente comando.
cat /home/labex/project/policy.py
def can_read(principal, doc): define una función con dos entradas. El return True indentado permite actualmente a todos. Un diccionario Python guarda campos con nombre: principal["id"] lee la identidad autenticada y doc["owner"] la propiedad almacenada. == compara valores y devuelve un booleano, verdadero o falso. Cuatro espacios iniciales mantienen return dentro de la función.
Sustituye la función por una comparación de propietario. El mismo método de documento literal del laboratorio anterior escribe el archivo completo:
cat > /home/labex/project/policy.py <<'EOF'
def can_read(principal, doc):
return doc["owner"] == principal["id"]
EOF
En la pestaña Test Client, repite la solicitud privada ajena:
Cambia a la pestaña Test Client antes de ejecutar el siguiente comando.
assistant call documents.read bob-notes
Espera HTTP 403 y document_denied. A diferencia de tool_denied, la operación de lectura está permitida, pero Alice no puede acceder a este objeto. Prueba la dirección inversa:
assistant --as bob call documents.read alice-notes
También debe rechazarse. El documento propio de Bob debe seguir siendo legible:
assistant --as bob call documents.read bob-notes
Espera HTTP 200. Si todas las lecturas fallan con policy_error, cambia a la pestaña Policy Editor y repite la edición conservando sangría y comillas; vuelve a la pestaña Test Client antes de repetir las lecturas. El servidor recarga la función en cada solicitud. Esta regla intermedia de propiedad todavía no restaura el acceso compartido intencionalmente; lo harás en el siguiente paso.
Restaurar el acceso compartido sin confiar en una identidad declarada
Selecciona la pestaña Policy Editor en la interfaz del laboratorio para comenzar este paso.
En este paso, permite el acceso compartido almacenado y rechaza una identidad falsificada en la propuesta.
La regla de propiedad impide a Alice leer team-plan, aunque Bob le concedió acceso explícito. En Python, in prueba pertenencia a una lista y or acepta cualquiera de las condiciones. Combina propiedad y pertenencia a la lista de acceso compartido almacenada. En la pestaña Policy Editor:
Cambia a la pestaña Policy Editor antes de ejecutar el siguiente comando.
cat > /home/labex/project/policy.py <<'EOF'
def can_read(principal, doc):
return doc["owner"] == principal["id"] or principal["id"] in doc["shared_with"]
EOF
En la pestaña Test Client, prueba el acceso compartido legítimo:
Cambia a la pestaña Test Client antes de ejecutar el siguiente comando.
assistant call documents.read team-plan
Espera HTTP 200 y Synthetic shared project plan. Envía ahora una identidad falsificada. --claim bob añade user_id: bob a los argumentos no fiables. No selecciona la credencial autenticada de Bob:
assistant replay documents.read bob-notes --claim bob
Espera HTTP 403, principal alice y document_denied. El servidor asocia la credencial real con Alice antes de llamar la política e ignora la identidad declarada en los argumentos. Prueba también el manejador directo:
assistant call documents.read bob-notes --claim bob
Debe rechazar igual. --as bob y --claim bob tienen significados deliberadamente distintos: el primero usa una credencial preparada de Bob; el segundo solo es texto en una propuesta.
Cambia a la pestaña Assistant Tool Lab, inicia sesión como alice con training-alice, elige documents.read, introduce bob-notes, coloca bob en Untrusted user_id (optional) y pulsa Replay proposal. Confirma que el servidor sigue identificando alice y deniega el documento privado. Cambia el documento a team-plan, borra la identidad declarada y reproduce: la lectura compartida útil debe funcionar.

Mantén la política de solo lectura de tools.json. La comprobación prueba ambas cuentas y rutas, casos propios/compartidos/privados y documentos desechables nuevos. IDs fijos, permitir todo, confiar en el usuario propuesto o denegar todo no satisfacen esa matriz. Puedes recuperar un error reescribiendo la función pequeña completa y reintentando una lectura.
Resumen
Aplicaste acceso documental con identidad autenticada y propiedad o acceso compartido almacenados. Un campo falsificado no se convierte en autoridad. El servidor conserva lecturas útiles propias y compartidas, y rechaza objetos privados y operaciones innecesarias. Esto demuestra autorización determinista, no fiabilidad de un modelo en vivo.



