Estou trabalhando em um pequeno aplicativo tentando entender os princípios do design controlado por domínio. Se for bem-sucedido, pode ser um piloto para um projeto maior. Estou tentando seguir o livro "Implementing Design Orientado a Domínios" (de Vaughn Vernon) e tentando implementar um fórum de discussão simples e semelhante. Também verifiquei as amostras do IDDD no github. Tenho algumas dificuldades em adotar a identidade e o acesso ao meu caso. Deixe-me dar algumas informações básicas:
- (Espero) compreendo o raciocínio por trás da separação da lógica de usuários e permissões: é um domínio de suporte e é um contexto limitado diferente.
- No domínio principal, não há usuários, apenas Autores, Moderadores, etc. Eles são criados acessando o contexto de Identidade e Acesso usando um serviço e, em seguida, convertendo os objetos Usuário recebidos para e Moderador.
As operações de domínio são chamadas com uma função relacionada como parâmetro: por exemplo:
ModeratePost( ..., moderator);
O método do objeto de domínio verifica se a instância do Moderador fornecida não é nula (a instância do Moderador será nula se o usuário solicitado no contexto Identidade e Acesso não tiver a função de Moderador).
Em um caso, ele faz uma verificação adicional antes de alterar uma postagem:
if (forum.IsModeratedby(moderator))
Minhas perguntas são:
Neste último caso, as preocupações de segurança não são misturadas novamente no domínio principal? Anteriormente, os livros afirmam "com quem pode postar um assunto ou sob quais condições são permitidas. Um fórum precisa saber que um autor está fazendo isso no momento".
A implementação baseada em funções no livro é bastante direta: quando um Moderador é o domínio principal, tenta converter o userId atual em uma instância do Moderador ou em um Autor quando necessário. O serviço responderá com a instância apropriada ou um valor nulo se o usuário não tiver a função necessária. No entanto, não vejo como adaptar isso a um modelo de segurança mais complexo; nosso projeto atual para o qual estou pilotando tem um modelo bastante complexo com grupos, ACLs etc.
Mesmo com regras que não são muito complexas, como: "Uma postagem deve ser editada apenas por seu proprietário ou por um editor", essa abordagem parece desmoronar, ou pelo menos não vejo a maneira correta de implementá-la.
Perguntar ao contexto Identity and Access que uma instância OwnerOrEditor não parece correta e eu terminaria com mais e mais classes relacionadas à segurança no domínio principal. Além disso, eu precisaria passar não apenas o userId, mas o identificador do recurso protegido (o ID da postagem, fórum etc.) para o contexto de segurança, que provavelmente não deveria se importar com essas coisas (está correto? )
Ao puxar as permissões para o domínio principal e verificá-las nos métodos dos objetos de domínio ou nos serviços, eu terminaria na estaca zero: misturando preocupações de segurança com o domínio.
Li em algum lugar (e tendem a concordar com isso) que essas coisas relacionadas a permissões não devem fazer parte do domínio principal, a menos que segurança e permissões sejam o próprio domínio principal. Uma regra simples como a mencionada acima justifica tornar a segurança parte do domínio principal?
HasPermissionToEdit(userId, resourceId)
mas não me sinto bem em contaminar a lógica do domínio com essas chamadas. Provavelmente eu deveria verificar isso nos métodos de serviço de aplicativo, antes de chamar a lógica do domínio?
UserService @AccessControlList[inf3rno]
na resposta à qual vinculei.