Big ACL pour les devs

Big ACL pour les développeurs

Big ACL vous aide à garder la logique d'autorisation explicite, testable et découplée du code applicatif. Au lieu de disperser des vérifications de rôles et des conditions dans les contrôleurs et services, vous vous appuyez sur un modèle de politiques évalué par un Point de Décision des Politiques (PDP) dédié.

PAP, PDP et PEP en pratique

Du point de vue du développeur :

  • PAP (Point d'Administration des Politiques) — où les politiques sont définies, revues, versionnées et testées. Big ACL est le PAP.
  • PDP (Point de Décision des Politiques) — un composant ou service qui évalue une politique pour une requête donnée (principal, action, ressource, contexte) et renvoie ALLOW ou DENY.
  • PEP (Point d'Application des Politiques) — du code dans votre application (filtres, intercepteurs, annotations) qui appelle le PDP et applique sa décision.

La place d'OpenID AuthZEN

OpenID AuthZEN vise à standardiser la manière dont les clients expriment les requêtes d'autorisation et obtiennent des décisions ou des tokens de décision. Pour les développeurs, cela signifie :

  • Une manière cohérente de décrire « qui fait quoi sur quelle ressource ».
  • L'interopérabilité entre différents PDP et composants d'application.
  • Moins de plomberie personnalisée pour intégrer un moteur de politiques dans vos apps.

Big ACL se concentre sur le modèle de politiques (PAP) et peut alimenter des PDP conformes à des standards comme AuthZEN. Votre code applicatif n'a qu'à s'intégrer avec le PDP / SDK choisi.

Exemple : Spring Security avec annotations et un PDP externe

Les contrôleurs restent déclaratifs via @PreAuthorize, tandis qu'une couche PEP légère appelle le PDP externe.

ProjectController.java


@RestController
@RequestMapping("/projects")
public class ProjectController {

    private final AuthorizationService authz;
    private final ProjectService service;

    public ProjectController(AuthorizationService authz, ProjectService service) {
        this.authz = authz;
        this.service = service;
    }

    @GetMapping("/{projectId}")
    @PreAuthorize("@authz.check(authentication, 'READ', 'PROJECT', #projectId)")
    public ProjectDto getProject(@PathVariable String projectId) {
        return service.get(projectId);
    }

    @DeleteMapping("/{projectId}")
    @PreAuthorize("@authz.check(authentication, 'DELETE', 'PROJECT', #projectId)")
    public void delete(@PathVariable String projectId) {
        service.delete(projectId);
    }
}
          

AuthorizationService.java


@Service
public class AuthorizationService {

    private final PolicyDecisionClient pdp;

    public AuthorizationService(PolicyDecisionClient pdp) {
        this.pdp = pdp;
    }

    public boolean check(Authentication auth, String action, String resource, String id) {
        return pdp.isAllowed(auth, action, resource, id);
    }

}