我有一個問題關於認證和TimerService @Timeout註釋:EJB3.1 TimerService @Timeout現任校長
在我們的應用程序的用戶可安排在給定的時間間隔要執行的任務,他們從任務列表中選擇,每個任務都與應用程序中的特定EJB相關聯。當用戶按下保存按鈕時,一個新的定時器被添加到Timer服務中,當@Timeout方法被調用時,用戶指定的一個方法用@Timeout方法調用
當超時方法由Timerservice發起,現任負責人是「匿名者」。如果你需要從timout方法中調用任何受保護的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);
}
}
@Timeout public void execute(Timer timer){ProgrammaticLogin programmaticLogin = new ProgrammaticLogin(); programmaticLogin.login(userName,password); – user829776
嗨,感謝上百萬,這正是我期待的目標,我們正在運行我們的glassfish應用程序,我無法找到大量關於程序登錄的示例,您的實現看起來類似於以下內容: ProgrammaticLogin programmaticLogin =新的ProgrammaticLogin(); programmaticLogin.login(userName,password); – user829776
是的,這就是我們使用的。我應該注意到我們正在爲我們的實現使用自定義的Realm(通常Glassfish只帶有一個文件,jdbc和一個LDAP領域)。我們所做的另一件事是傳遞簽名的令牌,而不是Realm可以檢測到的密碼,以便知道「它來自我們」,這樣我們就不需要以純文本形式獲得用戶的實際密碼。 –