Autorização em microsserviços - como abordar o controle de acesso no nível de entidade ou objeto de domínio usando a ACL?

Atualmente, estou criando um sistema baseado em microsserviços no java Spring Cloud. Alguns microsserviços usam PostgreSQL e alguns deles MongoDB. REST e JMS são usados para comunicação. O plano é usar o SSO e o OAuth2 para autenticação

O desafio que estou enfrentando é que a autorização deve ser feita no nível do objeto / entidade do domínio. Isso significa que é necessário algum tipo de ACL (lista de controle de acesso). A melhor prática para esse tipo de arquitetura é evitar algo assim e ter uma segurança granular provavelmente no nível da camada de aplicativo / serviço em todos os microsserviços, mas infelizmente isso não é possível.

Minha idéia final é usar o Spring Security ACL e ter as tabelas ACL no banco de dados compartilhado entre todos os microsserviços. O banco de dados seria acessado apenas pela infraestrutura do Spring ou pela API do Spring. O esquema do banco de dados parece estável e improvável será alterado. Nesse caso, eu simplesmente infringiria a regra sobre o compartilhamento de banco de dados entre microsserviços.

Eu estava considerando diferentes tipos de soluções distribuídas, mas as deixei:

Um microsserviço com ACL e acessando-o usando o restante - O problema são muitas chamadas http e degradação do desempenho. Eu teria que estender o Spring Security ACL para substituir o acesso db por chamadas de descansoACL em cada microsserviço para suas próprias entidades - Parece bastante razoável, mas imagine um caso com alguns modelos de leitura de entidades sincronizados com outros microsserviços ou com a mesma entidade que existe em diferentes contextos limitados (microsserviços diferentes). As ACLs podem se tornar realmente incontroláveis e podem ser fonte de erros.Um microsserviço com tabelas ACL que são sincronizadas com outros microsserviços como um modelo de leitura. O problema é que não há suporte no Spring Security ACL para MongoDB. Eu vi algumas soluções personalizadas no github e sim, é factível. Mas ... ao criar uma nova entidade, tenho que criar um registro no microsserviço que possui a ACL e, em seguida, ele é sincronizado de forma assíncrona como um modelo de leitura para o microsserviço que possui a entidade. Não soa como uma solução fácilEscolha algum controle de acesso baseado em URL no gateway da API. Mas eu teria que modificar o Spring Security ACL de alguma forma. O gateway da API precisaria saber muito sobre outros serviços. A granularidade do controle de acesso está vinculada à granularidade da API REST. Talvez eu não possa imaginar todas as consequências e outros problemas que essa abordagem trariaFinalmente, a solução com db compartilhado que mencionei é a minha favorita. Na verdade, foi o primeiro que eu desqualifiquei porque é um banco de dados "compartilhado". Mas, depois de analisar as possibilidades, pareceu-me que esse era o único que funcionaria. Há mais complexidade adicional, caso eu queira usar algum tipo de cache, porque seria necessário um cache distribuído.

Eu realmente usaria alguns conselhos e opiniões sobre como abordar a arquitetura, porque isso é realmente complicado e muitas coisas podem dar errado aqui.

Muito Obrigado,

Lukas

questionAnswers(1)

yourAnswerToTheQuestion