使用JAAS进行身份验证后无法从登录页面重定向

时间:2012-08-01 10:55:51

标签: java servlets redirect jetty jaas

用户登录后,如果再次访问/login,我想进行重定向,这样如果用户已经,则用户无法访问该登录表单认证

我正在使用 Jetty 8 ,我在FormAuthenticator.java:168方法validateRequest中发现,如果用户访问登录或错误页面,则用户从未进行过身份验证,尽管可能是这种情况

if (isLoginOrErrorPage(URIUtil.addPaths(request.getServletPath(),request.getPathInfo())))
    return Authentication.NOT_CHECKED;

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

我为你所描述的问题挣扎了一段时间......

我尝试使用会话的API,请求和响应在用户已经登录时进行重定向,但是在使用Jetty时,登录页面显然无法提供用户的身份验证数据。 / p>

我对JSP和Jetty完全不熟悉(我正在使用它进行课堂作业),但我提出了一个相当好的解决方案,甚至认为它不是理想的解决方案。

首先,我通过使用以下JSP在我的登录页面中添加一个变量以查看页面是否已经加载来进行小旁路:

<%
if(session.getAttribute("loginLoadedOnce") == "true")
{
    response.sendRedirect("/redirect.jsp");
}
else
{
    session.setAttribute("loginLoadedOnce", "true");
}
%>

这样,如果属性设置不正确,它将让用户尝试登录。否则,它将重定向到重定向页面。重定向页面将提供用户数据,并且可以查看用户是否具有某些角色。

重定向页面的JSP代码如下:

<%
if(request.isUserInRole("admin"))
{
    String url = response.encodeRedirectURL("admin/AdminPage.jsp");
    response.sendRedirect(url);
}
else if(request.isUserInRole("accounting"))
{
    String url = response.encodeRedirectURL("/accounting/Mainpage.jsp");
    response.sendRedirect(url);
}
else
{
    // Here the user has no role that we are aware of.
    session.setAttribute("loginLoadedOnce", "false"); // stop redirect loop.
    response.sendRedirect("/login.jsp");
}
%>

在这里,我们检查用户的角色,然后重定向到角色的正确页面。

就像现在一样,用户必须先退出才能返回登录页面。即使使用浏览器的“后退”按钮,每次尝试返回登录页面都会重定向。

希望这会对某人有所帮助。

答案 1 :(得分:3)

此问题已在2012-08-07修复。我认为Jetty没有按照预期在这里工作。出于这个原因,我filed a bug关于重定向行为。看看最新的Jetty 8,它现在应该适合你,分别看一下fix