我有一个在云平台上运行的 JavaEE 网站。现在我想使用两种类型的身份验证:
- 来自一个 SSO 系统,该系统很好地集成在平台中并且运行良好。
- 是有问题的部分:我想在会话期间从 1) 授权用户,并让他访问更受限制的资源。
一些细节
- 我从 1) 中获取用户和他的数据。
- 用户首先必须请求对 2) 的许可,这可以被拒绝或授予。用户从服务中获得授权,这超出了他的 servlet 的范围。
- 为此,我将 User-POJO(将此用户的会话作为成员)传递给服务。
如果服务授予此用户权限,它将为用户会话设置一个属性:
userSession.setAttribute("auth", "granted");
为了限制对该资源的访问,我使用了过滤器:
@WebFilter("/supersecret/*")
public class NiceFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession();
// check
if (session.getAttribute("auth") != "granted")
// redirect to login
else
chain.doFilter(req, res);
}
//...
虽然这目前正在工作,但我觉得我的解决方案非常草率。
- 在 servlet 范围之外更改用户会话似乎是不好的做法。
- 出于安全目的向会话添加属性可能不是一个好主意?
我宁愿使用标准的 JavaEE 机制,但它们中的大多数已经用于 auth-method 1),比如在 web.xml 中声明login-config 。
有什么想法可以更有效地解决这个问题吗?
提前致谢 :)