我正在使用JDBCRealm在我的Web应用程序中进行身份验证和授权。关于身份验证,我正在使用FORM和j_security_check服务。我已经配置了所有内容,包括HTTP状态403错误页面,如果用户没有访问资源所需的权限,他/她将被重定向。到目前为止,一切正常。返回 HTTP 状态 403 错误时出现问题。在我看来,尽管用户未获得授权,但只要他/她已成功通过身份验证,仍会为此用户创建 JSF 会话。现在,当我尝试返回登录页面并输入有权访问资源的用户的密码和用户名时,它无法授权,因为授权仍应用于持有当前会话的用户,而该用户显然没有所需的权限。现在我需要知道的是如何销毁或使返回 HTTP 状态 403 时创建的此类会话无效。谢谢
更新:我认为重要的是要提到,当会话超时时,我现在能够登录具有所需权限的用户。 只是一个提示...
简单!...您可以在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
将被终止
我遇到了同样的问题,但我使用的是检票口。因此,将以下 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>