0

我有一个简单的用例,我想在会话开始时获取会话变量,并且只允许根据结果访问某些页面。我不太清楚这是使用 bindInterceptor 拦截任何页面上的任何 @Get 或 @Post 方法最好还是使用过滤器更好。这是我想做但对替代方案持开放态度的草图:

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
}

哪种技术是管理此安全模型的首选方法(最少代码、最快等)?我很想看一个示例项目。

谢谢你的帮助!

-约翰

4

1 回答 1

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。

于 2012-08-26T17:38:28.820 回答