我有一个简单的用例,我想在会话开始时获取会话变量,并且只允许根据结果访问某些页面。我不是真的很清楚这是使用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
}
哪种技术是管理此安全模型的首选方法(代码最少,速度最快等)?我很想看到一个示例项目。
感谢您的帮助!
-John
答案 0 :(得分:1)
这样做的常用方法是使用过滤器。鉴于您似乎将URI空间隔离为不同的所需权限,这也可能是最简单的方法。如果您希望在方法/类(“@AdminRequired
”等)上声明身份验证逻辑,那么bindInterceptor样式很有用,但实际上没有充分的理由 - 隔离URI空间更容易。
只需绑定一个获取当前用户/授权逻辑的Filter,并检查权限是否与请求所针对的URI相匹配。
E.g。
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。