0

我正在使用 JDBCRealm 在我的 Web 应用程序中进行身份验证和授权。关于身份验证,我将 FORM 与 j_security_check 服务一起使用。我已经配置了所有内容,包括 HTTP 状态 403 错误页面,如果他/她没有访问资源所需的权限,用户将被重定向到该页面。到目前为止,一切正常。当返回 HTTP 状态 403 错误时,问题就出现了。在我看来,尽管用户尚未获得授权,但只要他/她已成功通过身份验证,仍会为此用户创建 JSF 会话。现在,当我尝试返回登录页面并输入有权访问资源的用户的密码和用户名时,它无法授权,因为授权仍在应用于显然没有所需权限的当前会话的用户。现在我需要知道的是如何销毁或使返回 HTTP 状态 403 时创建的此类会话无效。谢谢

更新:我认为重要的是要提到当会话超时时,我现在可以登录具有所需权限的用户。只是一个提示...

4

2 回答 2

1

简单!...您可以在其中配置它Web.xml

只需在 中定义错误代码Web.xml,那么当您的视图页面加载时会发生什么如果403抛出意味着定义的错误页面将被自动调用。

代码:

<error-code>403</error-code>
         <location>/error.xhtml</location>
</error-page>

在错误页面..你可以做你想做的事..

要终止当前会话,最好的方法是通过 FacesContext 使会话无效

HttpServletRequest request=HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();

执行完这段代码后,currect session将终止

于 2013-09-16T07:58:08.060 回答
0

我有同样的问题,但我正在使用检票口。因此将以下 JSP 定义为错误页面:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title>User Authorization Error (403)</title>
    </head>
    <body>
        <% 
            String userName    = "<No User>";
            String contextPath = request.getContextPath ();
            java.security.Principal principal = request.getUserPrincipal ();
            if (principal != null) userName = principal.getName ();
            request.getSession ().invalidate ();
        %>
        <h2>The user '<%=userName %>' is not authorized to access the page</h2>
        <p>
            <a href="<%= contextPath %>/protected">Login again with an authorized user</a>
        </p>
    </body>
</html>
于 2016-03-24T10:18:33.247 回答