Deltaspike e @Stateless Bean

Quero proteger meu EJb “Stateless” com a API DeltaSpike.

@Stateless @Remote(UserServiceRemote.class) public class UserService implements UserServiceRemote 

No nível do método eu tenho uma anotação personalizada “Suporte”

 @Support public void doSomething() {} 

Por isso escrevi uma anotação personalizada “@Support”:

 @Retention(value = RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD }) @Documented @SecurityBindingType public @interface Support { 

Meu autorizador personalizado se parece com:

 @Secures @Support public boolean doAdminCheck(Identity identity, IdentityManager identityManager, RelationshipManager relationshipManager) throws Exception { return hasRole(relationshipManager, identity.getAccount(), getRole(identityManager, "Support")); } 

No meu arquivo “beans.xml” eu incluí:

  org.apache.deltaspike.security.impl.extension.SecurityInterceptor  

Mas depois de fazer login no aplicativo e chamar o método “doSomething” por chamada remota, a anotação “Suporte” é ignorada, independentemente de eu ter ou não a function.

O que estou fazendo errado? Obrigado por todas as sugestões !!!

Ejb e CDI são dois conceitos diferentes. Um bean de session sem estado e um bean CDI gerenciado são gerenciados por contêineres diferentes. Portanto, você não pode usar o Deltaspike em um bean de session sem estado. Se você quiser usar segurança deltaspike, use um bean nomeado e use uma estratégia de comunicação remota diferente.

No meu caso eu tinha que ter certeza que o módulo (jar) contendo o serviço que eu queria proteger com a anotação tinha o arquivo beans.xml com o deltaspike interceptor nele (anteriormente eu estava adicionando o arquivo somente ao módulo com o próprio código de segurança, que era um problema).

Também descobri que precisava separar o serviço de lógica de negócios da própria declaração de terminal SOAP. Este serviço personalizado EJB @Stateles (ou qualquer outro) pode ser @ Injetado no SOAP e as annotations de segurança (aqui, @Support) funcionarão nele.

Na minha opinião, a separação da declaração de endpoint do código de negócios é, de qualquer maneira, um bom design, já que podemos ter várias interfaces invocando a mesma lógica de negócios. (e é mais fácil testar a unidade, etc.)

Dependendo do modo de detecção de beans definido em beans.xml, seu UserService pode não ser acessível a partir do contêiner CDI. Você deve estar usando um modo de descoberta “anotado” e anotando seu UserService com Dependente.

Intereting Posts