EJB3.1 TimerService @Timeout текущий участник - PullRequest
1 голос
/ 05 июля 2011

У меня есть вопрос относительно аутентификации и аннотации TimerService @Timeout:

В нашем приложении пользователи могут планировать выполнение задач с заданным интервалом. Они выбирают из списка задач, каждая задача связана с определенным EJB-компонентом в приложении. Когда пользователь нажимает кнопку сохранения, в службу Timer добавляется новый таймер, когда вызывается метод @Timeout, метод в EJB, из которого указанный пользователь вызывается с помощью метода @Timeout

Когда метод тайм-аута вызывается службой Timer, текущим принципалом является «ANONYMOUS». Это проблематично, если вам нужно вызывать какие-либо защищенные EJB-компоненты из метода тайм-аута. Можно ли изменить текущий принципал и роль на тот же принципал и роль, что и пользователь, создавший таймер?

@Singleton
@LocalBean
public class TestEJB 
{

    @Resource
    SessionContext context;
    @Resource
    TimerService timerService;

    @Timeout
    public void execute(Timer timer) throws Exception {
        //Get the current username
        System.out.println(context.getCallerPrincipal().getName());
    }

    public void createScheduledTimer(ScheduleExpression e,String timerId) throws IllegalArgumentException, IllegalStateException, EJBException {
        TimerConfig tc = new TimerConfig();
        tc.setInfo(timerId);
        tc.setPersistent(true);
        timerService.createCalendarTimer(e, tc);
    }

}

Ответы [ 3 ]

1 голос
/ 05 июля 2011

Мы сделали это в Glassfish.В нашем случае у нас есть универсальный bean-компонент Timer, который может выполнять любую из нескольких задач, а не bean-компонент на задачу, как вы делаете, но концепция та же самая.

В итоге мы записалиПользователь, когда задача отправлена, мы используем специальную функцию Glassfish ProgramaticLogin для входа пользователя в систему при запуске таймера.Таким образом, весь контекст безопасности EJB настраивается соответствующим образом для пользователя и задачи.

1 голос
/ 05 июля 2011

попробуйте использовать @RunAs. посмотрите пример здесь: http://www.shareyourwork.org/roller/ralphsjavablog/entry/using_runas_in_ejb_3

0 голосов
/ 05 июля 2011

Поскольку вы используете 3.1 Stateful Session Beans, поддерживаются для таймеров.Попробуйте аннотировать ваш бин @Stateful вместо @Singleton.Затем попробуйте получить имя пользователя в вашем createScheduledTimer методе.Сохраните его как личное поле, а затем получите доступ к нему в методе @Timeout.

...