2011-09-06 72 views
0

我有一個簡單的用例,我想在會話開始時獲取會話變量,並且只允許根據結果訪問某些頁面。我不是很清楚這是最好的使用bindInterceptor攔截任何頁面上的任何@Get或@Post方法或使用過濾器更好。這裏是想我做的,但草圖很開放的替代品:bindInterceptor vs過濾器的guice安全性?

At the start of a new session (@SessionScoped ?), check a session variable authentication token 

If (authentication == admin) { 
    serveRegex("admin/(jsp|html)/.*").with(GuiceContainer.class); //only allow /admin subpages 
    req.getRequestDispatcher("/admin").forward(req, res); //fwd all initial page requests to /admin 
} 
else If (authentication == user) { 
    serveRegex("user/(jsp|html)/.*").with(GuiceContainer.class); //only allow /user subpages 
    req.getRequestDispatcher("/user").forward(req, res); //fwd all initial page requests to /user 
} 
else { 
    serveRegex("signin/(jsp|html)/.*").with(GuiceContainer.class); //only allow /signin subpages 
    req.getRequestDispatcher("/signin").forward(req, res); //fwd all initial page requests to /signin 
} 

哪些技術是一種用於管理該安全模型的首選方法(至少代碼,最快的速度,等等)?我很想看到一個示例項目。

感謝您的幫助!

-John

回答

1

這樣做的常用方法是使用過濾器。鑑於您似乎將URI空間分隔爲不同的所需權限,這也可能是最簡單的方法。如果你想在方法/類(「@AdminRequired」等)上聲明認證邏輯,但是確實沒有理由這麼做,那麼bindInterceptor風格很有用 - 分離URI空間更容易。

只需綁定一個獲取當前用戶/授權邏輯的過濾器,並檢查權限是否與請求將發往的URI相匹配。

例如

class AuthenticationFilter implements Filter { 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
    User user = getUserSomehow(); 
    if (user == null) { 
     response.sendRedirect(... login page ...); 
     return; 
    } 
    if (request.getRequestURI().startsWith("/admin")) { 
     // Enforce Admin login, error out otherwise. 
    } 
    // Proceed with executing the request. 
    chain.doFilter(request, response); 
    } 
} 

請注意,您必須將ServletRequest/Response下傳到HttpServletRequest/Response。