Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
11 changes: 11 additions & 0 deletions benches/08-identidad-y-acceso.md
Original file line number Diff line number Diff line change
@@ -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.
1 change: 1 addition & 0 deletions benches/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
21 changes: 18 additions & 3 deletions docs/08-identidad-y-acceso.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
23 changes: 23 additions & 0 deletions docs/ejercicios/08-identidad-y-acceso.md
Original file line number Diff line number Diff line change
@@ -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
```
1 change: 1 addition & 0 deletions docs/ejercicios/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
12 changes: 12 additions & 0 deletions examples/soluciones/08-identidad-y-acceso.rs
Original file line number Diff line number Diff line change
@@ -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<dyn std::error::Error>> {
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(())
}
Loading