Pergunta

É possível fazer algo como o seguinte:

public void doStuff(@RequirePrivilege("foo") User user) {
    // ...
}

e tê-lo efetivamente executado como se fosse o seguinte?

public void doStuff(User user) {
    if(!user.hasPrivilege("foo"))
        throw new UserHasInsufficientPrivileges(); // this is a RuntimeException
    // ...
}

Eu sei que a Primavera tem vários tipos de suporte AOP, mas o melhor que eu poderia encontrar era código AOP que foi anotado para que ele iria executar antes ou depois de um método específico. Eu quero fazer o inverso e anotar o código que deve ser alterado.

Em última análise, eu poderia apenas fazer a verificação acima dentro do método, mas a forma como anotação de fazer as coisas fornece documentação adicional que torna óbvio que o usuário requer um privilégio especial sem ter de manter a documentação em sincronia com o código.

Foi útil?

Solução

Você pode olhar para usando AspectJ para fazer isso, uma vez que irá corresponder em anotações. Você pode então usar um aspecto em torno de decidir se o usuário atende aos requisitos para usar esse método.

Spring permite usar AspectJ, e gostaria de sugerir que, se possível, você não fazer isso em tempo de execução, mas em tempo de compilação, como não há nenhuma razão para pagar o preço para usar este aspecto sempre que você iniciar a aplicação . Mas, se você deve fazê-lo em tempo de execução, em seguida, que é factível, para mim eu tento usar tempo de compilação, tanto quanto possível.

Você pode querer olhar para AspectJ In Action ( http://www.manning.com/laddad2/ ), mas aqui está um exemplo de lá: padrão de assinatura:

* *(@RequestParam
(@Sensitive *))

Descrição

*Any method with one parameter marked with the @RequestParam annotations and the parameter’s type is marked with the @Sensitive annotation.*

Exemplo

void create(@RequestParam
MedicalRecord mr), assuming
MedicalRecord carries the
@Sensitive annotation.

Outras dicas

Estou certo de que o seu "privilégios insuficientes" exemplo pode ser feito com Spring AOP , porque é assim que funciona Spring Security. Você pode fazer algumas coisas muito sofisticadas com conselhos ao redor e AspectJ.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top