2013-09-18 2 views
4

Я использую picketlink для аутентификации пользователя по проекту. Я также создал @produces аннотированный метод, поэтому я мог бы ввести аутентифицированного пользователя в другие места. Теперь я использую envers и помимо информации по умолчанию, я хотел бы сохранить пользователя, выполнившего действие, но я не могу его вводить в приемник envers. Он всегда равен нулю. Как я могу сделать эту инъекцию или получить эту информацию?picketlink, envers и cdi injection

Класс производителя:

@SessionScoped 
public class Resources implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @EJB 
    private AuthenticationManagerBean authenticator; 

    @Inject 
    private Identity credentials; 

    @CurrentUser 
    private AuthenticatedUser currentUser; 

    @Produces 
    @CurrentUser 
    @SessionScoped 
    private AuthenticatedUser createAuthenticatedUser() { 
     AuthenticatedUser user = new AuthenticatedUser(); 
     org.picketlink.idm.model.basic.User loggedInUser = (org.picketlink.idm.model.basic.User) credentials.getAccount(); 

     User pu = authenticator.getUserRoles(loggedInUser.getLoginName()); 

     if (pu != null) { 
      user.setUser(pu.getName()); 

      for (Role role : pu.getRoles()) { 
       user.getRoles().add(role.getName()); 
      } 
     } 

     return user; 
    } 

    @Produces 
    public Logger produceLog(InjectionPoint injectionPoint) { 
     return LoggerFactory.getLogger(injectionPoint.getMember().getDeclaringClass().getName()); 
    } 

и слушатель Envers:

public class AuditListener implements RevisionListener, Serializable { 

    private static final long serialVersionUID = 1L; 

    @Inject 
    @CurrentUser 
    private AuthenticatedUser identity; //this is always null 

    public void newRevision(Object revisionEntity) { 

     System.out.println(identity.getUser()); 
    } 
} 

ответ

3

Я был похож проблемы. Впрыск не работает, потому что RegisionListener не управляется CDI. Таким образом, вы должны сами искать фасоль. Так вы могли бы это сделать:

public AuthenticatedUser getAuthenticatedUser() { 
    BeanManager beanManager = (BeanManager) new InitialContext().lookup("java:comp/BeanManager"); 
    Bean<AuthenticatedUser> bean = (Bean<AuthenticatedUser>) beanManager.getBeans(AuthenticatedUser.class, new AnnotationLiteral<CurrentUser>() { 
    }).iterator().next(); 

    CreationalContext<AuthenticatedUser> ctx = beanManager.createCreationalContext(bean); 
    return (AuthenticatedUser) beanManager.getReference(bean, AuthenticatedUser.class, ctx); 
} 
Смежные вопросы