Introdução
O assistente já está limitado a documents.read, mas uma ferramenta permitida ainda pode solicitar um documento proibido. Você mantém uma instância nova cuja política de objetos permite todas as leituras.
Acrescente uma pequena regra Python em duas etapas: proteja a propriedade e depois preserve o compartilhamento explícito. O servidor obtém a identidade de sessões autenticadas, não de argumentos propostos. Todos os documentos são sintéticos e as propostas são reproduções declaradas; leituras e autorização são reais. Basta o conhecimento de terminal do laboratório anterior; a sintaxe Python é explicada aqui.
Vincule leituras ao proprietário autenticado
Nesta etapa, impeça uma ferramenta permitida de alcançar o documento privado de outro usuário.
Selecione a aba Test Client na interface do laboratório para começar esta etapa.
Use esta tabela de acesso. owner e shared_with são campos documentais armazenados, não valores de uma proposta.
| Documento | Proprietário | Compartilhado com | Alice pode ler | Bob pode ler |
|---|---|---|---|---|
alice-notes |
alice |
ninguém | sim | não |
bob-notes |
bob |
ninguém | não | sim |
team-plan |
bob |
alice |
sim | sim |
Em Test Client, --as bob seleciona a credencial autenticada preparada de Bob. Omiti-lo seleciona Alice. Confirme primeiro a leitura normal do proprietário:
Mude para a aba Test Client antes de executar o comando a seguir.
assistant call documents.read alice-notes
Espere HTTP 200 e o conteúdo de Alice. Reproduza agora a ausência de verificação de objeto:
assistant call documents.read bob-notes
Retorna incorretamente HTTP 200 e Synthetic Bob private budget. Nenhuma informação privada real é usada. Só a lista de ferramentas não protegeu o objeto.
Mude para a aba Policy Editor. Examine a pequena política:
Mude para a aba Policy Editor antes de executar o comando a seguir.
cat /home/labex/project/policy.py
def can_read(principal, doc): define uma função com duas entradas. O return True indentado permite atualmente a todos. Um dicionário Python armazena campos nomeados: principal["id"] lê a identidade autenticada e doc["owner"] a propriedade armazenada. == compara valores e retorna um booleano, verdadeiro ou falso. Quatro espaços iniciais mantêm return dentro da função.
Substitua a função por uma comparação de proprietário. O mesmo método de here-document literal do laboratório anterior escreve o arquivo inteiro:
cat > /home/labex/project/policy.py <<'EOF'
def can_read(principal, doc):
return doc["owner"] == principal["id"]
EOF
Mude para a aba Test Client. Repita o pedido de documento privado de outra pessoa:
Mude para a aba Test Client antes de executar o comando a seguir.
assistant call documents.read bob-notes
Espere HTTP 403 e document_denied. Diferentemente de tool_denied, a operação de leitura é permitida, mas este objeto é proibido para Alice. Teste o sentido inverso:
assistant --as bob call documents.read alice-notes
Também deve ser recusado. O documento do próprio Bob deve continuar legível:
assistant --as bob call documents.read bob-notes
Espere HTTP 200. Se todas as leituras falharem com policy_error, mude para a aba Policy Editor e repita a edição mantendo indentação e aspas; volte à aba Test Client antes de repetir as leituras. O servidor recarrega a função a cada pedido. Essa regra intermediária de propriedade ainda não restaura compartilhamento intencionalmente; isso ocorre na próxima etapa.
Restaure compartilhamento sem confiar em identidade declarada
Nesta etapa, permita compartilhamento armazenado e recuse uma identidade falsificada na proposta.
Selecione a aba Policy Editor na interface do laboratório para começar esta etapa.
A regra de proprietário bloqueia Alice em team-plan, embora Bob tenha concedido acesso explícito. Em Python, in testa inclusão em uma lista e or aceita qualquer uma das condições. Combine propriedade com participação na lista armazenada de compartilhamento. Em Policy Editor:
Mude para a aba Policy Editor antes de executar o comando a seguir.
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
Mude para a aba Test Client. Teste o compartilhamento legítimo:
Mude para a aba Test Client antes de executar o comando a seguir.
assistant call documents.read team-plan
Espere HTTP 200 e Synthetic shared project plan. Agora envie uma identidade falsificada. --claim bob acrescenta user_id: bob aos argumentos não confiáveis. Não seleciona a credencial autenticada de Bob:
assistant replay documents.read bob-notes --claim bob
Espere HTTP 403, principal alice e document_denied. Antes de chamar a política, o servidor associa a credencial real a Alice e ignora a identidade declarada no argumento. Experimente o manipulador direto também:
assistant call documents.read bob-notes --claim bob
Deve recusar da mesma forma. --as bob e --claim bob têm significados diferentes de propósito: o primeiro usa uma credencial preparada de Bob; o segundo é apenas texto na proposta.
Mude para a aba Assistant Tool Lab, entre como alice com training-alice, escolha documents.read, informe bob-notes, coloque bob em Untrusted user_id (optional) e clique em Replay proposal. Confirme que o resultado ainda identifica alice e recusa o documento privado. Troque para team-plan, limpe a identidade declarada e reproduza: a leitura compartilhada útil deve funcionar.

Mantenha a política de somente leitura em tools.json. A verificação testa ambas as contas e rotas, propriedade/compartilhamento/privacidade e documentos descartáveis desconhecidos. IDs fixos, permitir tudo, confiar no usuário proposto ou negar tudo não satisfazem essa matriz. Um erro é recuperável reescrevendo a função pequena inteira e tentando uma leitura novamente.
Resumo
Você aplicou acesso documental com identidade autenticada e propriedade ou compartilhamento armazenados. Um campo falsificado de proposta não vira autoridade. O servidor mantém leituras úteis próprias e compartilhadas, negando objetos privados e operações desnecessárias. Isso demonstra autorização determinística de ferramentas, não confiabilidade de um modelo ao vivo.



