2014-05-15 51 views
0

我使用澤西島(1.18.1)並啓用RolesAllowedResourceFilterFactory。 假設我有以下資源:澤西島:區分會話超時和缺乏授權

@RolesAllowed("SuperUser") 
@Path("/resource") 
class Resource{ 
    //some code here 
} 

在訪問該資源時,會話超時服務器拋出沒有消息任何一個WebApplicationException,但它也做到這一點,如果沒有必要的角色嘗試用戶訪問給定的資源。所以:如何區分會話超時和缺少必要角色?

我需要這樣做,因爲我想發送一條適當的消息(從ExceptionMapper)到前端並在那裏採取適當的措施。

回答

0

我已經解決了這個問題,將SecurityContext注入ExceptionMapper並檢查用戶是否分配了任何角色。如果它有和webAppException.getResponse().getStatus()狀態代碼等於FORBIDDEN(403)那麼異常的原因是缺乏授權(用戶沒有必要的角色)。如果用戶沒有任何分配的角色,並且響應的狀態碼是403,則表示會話已過期,否則其他原因是異常。

這種方法有一個很大的缺點 - 它要求所有用戶至少有一個指定的角色,否則它將無法工作;

0

我不認爲有這樣做的構建方式,因爲那時容器需要記住過期的sessionIds及其關聯的用戶。據我所知容器只會在會話超時時刪除這些信息。 但是您可以嘗試自行完成此操作:

實施HttpSessionListener並將過期的SessionID存儲在某種緩存中。很可能您只想向授權用戶顯示「您的會話過期」消息,但也可以爲非授權用戶創建HTTP會話。所以你需要檢查用戶是否被授權。由於您無權訪問SessionListener中的UserPrincipal,因此您需要在會話中自行存儲一些信息。

@WebListener 
public class HttpSessionChecker implements HttpSessionListener { 

    @Inject 
    private SessionIdCache cache; 

    public void sessionCreated(HttpSessionEvent event) {} 

    public void sessionDestroyed(HttpSessionEvent event) { 
     if (event.getSession().getAttribute("someAuthInformation") != null) { // whatever you've stored 
      cache.put(event.getSession().getId(), new Date()); 
     } 
    } 

} 

在你ExceptionMapper你現在可以檢查是否有JSESSIONID cookie的是請求頭的一部分,如果傳遞的會話ID是在緩存中。

@Provider 
public class ExMapper implements ExceptionMapper<Exception> { 

    @Inject 
    private SessionIdCache cache; 

    @Context 
    private HttpServletRequest request; 

    @Override 
    public Response toResponse(Exception ex) { 
     for (Cookie cookie : request.getCookies()) { 
      if ("JSESSIONID".equals(cookie.getName())) { 
       String sessionId = cookie.getValue().substring(0, cookie.getValue().lastIndexOf('.')); // ignore .hostname 
       if (cache.contains(sessionId)) { 
        return Response.serverError().entity("Your session timed out").build(); 
       } 
      } 
     } 
     return Response.serverError().build(); 
    } 

} 

您應該考慮不時清理緩存。

+0

感謝您的迴應,但我找到了更好的解決方案:) –