From 82de70e5795d4c82fc9f904b872607fdcfcb6e64 Mon Sep 17 00:00:00 2001 From: Joel Alvarez Date: Mon, 27 Jul 2026 13:29:52 -0700 Subject: [PATCH] docs: add identity and access exercises --- Cargo.toml | 4 ++++ benches/08-identidad-y-acceso.md | 11 ++++++++++ benches/README.md | 1 + docs/08-identidad-y-acceso.md | 21 +++++++++++++++--- docs/ejercicios/08-identidad-y-acceso.md | 23 ++++++++++++++++++++ docs/ejercicios/README.md | 1 + examples/soluciones/08-identidad-y-acceso.rs | 12 ++++++++++ 7 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 benches/08-identidad-y-acceso.md create mode 100644 docs/ejercicios/08-identidad-y-acceso.md create mode 100644 examples/soluciones/08-identidad-y-acceso.rs diff --git a/Cargo.toml b/Cargo.toml index d245372..3ffd9dd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,3 +38,7 @@ path = "examples/soluciones/06-estilos-alternativos.rs" [[example]] name = "07-operacion-de-apis-solucion" path = "examples/soluciones/07-operacion-de-apis.rs" + +[[example]] +name = "08-identidad-y-acceso-solucion" +path = "examples/soluciones/08-identidad-y-acceso.rs" diff --git a/benches/08-identidad-y-acceso.md b/benches/08-identidad-y-acceso.md new file mode 100644 index 0000000..3c58b72 --- /dev/null +++ b/benches/08-identidad-y-acceso.md @@ -0,0 +1,11 @@ +# Decisión de benchmark: identidad y acceso + +**Estado:** draft + +No se agrega benchmark ejecutable. El modelo evalúa una credencial y una regla +en memoria; medirlo no decide una frontera de acceso ni una política de +auditoría. + +Un benchmark será pertinente cuando una integración concreta deba comparar una +decisión reproducible, como la validación de credenciales bajo carga o la +latencia de una política de permisos remota. diff --git a/benches/README.md b/benches/README.md index b158352..74da628 100644 --- a/benches/README.md +++ b/benches/README.md @@ -11,3 +11,4 @@ documentadas por capítulo. - [05. Contratos ejecutables](05-contratos-ejecutables.md) - [06. Estilos alternativos](06-estilos-alternativos.md) - [07. Operación de APIs](07-operacion-de-apis.md) +- [08. Identidad y acceso](08-identidad-y-acceso.md) diff --git a/docs/08-identidad-y-acceso.md b/docs/08-identidad-y-acceso.md index 3d66f0a..19e510d 100644 --- a/docs/08-identidad-y-acceso.md +++ b/docs/08-identidad-y-acceso.md @@ -144,11 +144,26 @@ sin la capacidad necesaria y rechazan una credencial destinada a otra audiencia. No sustituyen políticas reales; protegen las fronteras mínimas que una integración debe conservar. +## Práctica + +Los ejercicios están en +[`docs/ejercicios/08-identidad-y-acceso.md`](ejercicios/08-identidad-y-acceso.md) +y la solución ejecutable en +[`examples/soluciones/08-identidad-y-acceso.rs`](../examples/soluciones/08-identidad-y-acceso.rs). +Antes de consultar la solución, justifica qué capacidad se concede y qué dato +debe ocultar una denegación entre recursos de organizaciones distintas. + +## Benchmark + +La decisión de benchmark está en +[`benches/08-identidad-y-acceso.md`](../benches/08-identidad-y-acceso.md). +El modelo evalúa texto y decisiones en memoria; medirlo no modifica una +decisión sobre permisos, vigencia ni auditoría. + ## Siguiente paso -El siguiente bloque añadirá práctica, solución ejecutable y una decisión de -benchmark. Después el curso abordará seguridad de APIs y las amenazas que -estas fronteras deben resistir. +El siguiente capítulo aborda seguridad de APIs y las amenazas que estas +fronteras deben resistir. ## Decisiones registradas diff --git a/docs/ejercicios/08-identidad-y-acceso.md b/docs/ejercicios/08-identidad-y-acceso.md new file mode 100644 index 0000000..8f5e88b --- /dev/null +++ b/docs/ejercicios/08-identidad-y-acceso.md @@ -0,0 +1,23 @@ +# Ejercicios: identidad y acceso + +**Estado:** draft + +## Ejercicio 1: separar preguntas + +Para una credencial válida de Ana, distingue qué verifica la audiencia y qué +decide la autorización al leer o actualizar un pago. Explica qué detalle no +debe revelarse cuando Ana intenta modificar un recurso ajeno. + +## Ejercicio 2: declarar una lectura permitida + +Construye una solicitud para que Ana lea `payment:123` en `payments-api`. +Antes de programar, identifica sujeto, acción, recurso y la capacidad que se +concede sin convertir la sesión en permiso general. + +## Ejercicio 3: solución ejecutable + +Compila la lectura autorizada con: + +```sh +cargo run --example 08-identidad-y-acceso-solucion +``` diff --git a/docs/ejercicios/README.md b/docs/ejercicios/README.md index f8fa15a..12c296c 100644 --- a/docs/ejercicios/README.md +++ b/docs/ejercicios/README.md @@ -11,3 +11,4 @@ después de justificar el diseño propio. - [05. Contratos ejecutables](05-contratos-ejecutables.md) - [06. Estilos alternativos](06-estilos-alternativos.md) - [07. Operación de APIs](07-operacion-de-apis.md) +- [08. Identidad y acceso](08-identidad-y-acceso.md) diff --git a/examples/soluciones/08-identidad-y-acceso.rs b/examples/soluciones/08-identidad-y-acceso.rs new file mode 100644 index 0000000..faf8b0c --- /dev/null +++ b/examples/soluciones/08-identidad-y-acceso.rs @@ -0,0 +1,12 @@ +//! Solución del ejercicio del capítulo 8. + +use rust_api_design::identity_access::{AccessRequest, Action, Credential, decide}; + +fn main() -> Result<(), Box> { + let credential = Credential::new("ana", "payments-api")?; + let request = AccessRequest::new(credential, Action::Read, "payment:123")?; + let decision = decide(&request, "payments-api", "ana", Action::Read)?; + + println!("Decisión: {:?}.", decision); + Ok(()) +}