Normalmente, eu coloco decisões de autorização nos controladores do servidor. Esses foram os pontos de extremidade RESTful recentemente, mas acho que o mesmo vale para as arquiteturas do tipo MVC. Por uma questão de argumento, assuma que é uma autorização baseada em função. Um método protegido será anotado ou fará verificações e retornará 403s, se necessário.
Agora, considerando que a autorização é de fato uma regra comercial - "apenas administradores podem listar X", por exemplo, acho que eles devem ser empurrados para uma camada. Quando um controlador solicita que a camada de negócios execute a operação, o serviço ou a camada de negócios informa ao controlador que não está autorizado.
Essa é uma abordagem razoável? Existem desvantagens nisso?
Detesto ter um AuthorisationService que essencialmente contém um monte de regras codificadas de procedimentos estáticos para fazer isso, mas talvez faça sentido manter toda a lógica de acesso em um único local. É uma preocupação transversal que deve ser mantida em separado?
Então, eu estou perguntando se alguém fez isso e como eles conseguiram isso de uma maneira limpa ou se existem bons recursos que eu possa ler. Estou usando o Java fwiw, mas esta é uma questão independente da linguagem.
Eu verifiquei as perguntas relacionadas aqui e elas são muito finas no chão e respostas. Por exemplo: Validação e Autorização em Modelos de Domínio e Transmitindo isso através de uma Camada de Serviço para MVC
Estou lendo os documentos de segurança da primavera que apresentam bons argumentos por se tratar de uma preocupação transversal, mas estou preocupado que seja apenas o "caminho da primavera" e que gostaria de ter perspectivas mais amplas. Também vincula seu aplicativo a uma estrutura específica.