我们使用 JBoss 7.1、MySQL/PostgreSQL DB、JSF 2.0 和 CDI bean。
我必须通过登录名和密码实现基于数据库的身份验证。我们有一个管理(行政)门户。当客户端在未登录的情况下打开受限页面时,如果客户端未登录,则应将请求重定向到login.*
页面。
我试图通过使用PhaseListener
. 我可以登录和注销,但是当我尝试打开另一个页面时遇到了一个问题:我无法在类中获取@Named("user") public class UserManager
bean 。PhaseListener
我试图通过使用FacesContext
, & EL ... 来获得它,但这一切都没有帮助我。
UserManager
验证登录并将登录的用户存储为属性current
。对于每个请求,我都想检查PhaseListener
if #{user.current}
is not null
。但我无法#{user}
在PhaseListener
.
我怎样才能得到一个@Named
豆子beforePhase()
or afterPhase()
?
更新:这是我迄今为止的尝试:
private boolean loggedIn( FacesContext context ) throws IOException, ServletException
{
LOGSTORE.debug( "loggedIn().2 " );
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
// ELContext elContext = FacesContext.getCurrentInstance().getELContext();
// UserManager userManager = (UserManager) FacesContext.getCurrentInstance().getApplication()
// .getELResolver().getValue( elContext, null, "user" );
HttpSession session = (HttpSession) context.getExternalContext().getSession( true );
UserManager userManager = (UserManager) session.getAttribute( "user" );
// UserManager userManager = (UserManager) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get( "user" );
if (!StringUtils.contains( ((HttpServletRequest) context.getExternalContext().getRequest())
.getRequestURL().toString(), URL_SESSION_EXPIRED ))
{
if (userManager == null || !userManager.isLoggedIn())
{
LOGSTORE.debug( " userManager is " + (userManager == null ? "" : "not ") + " null" );
if (userManager != null)
{
LOGSTORE.debug( " userManager.isLoggedIn() is "
+ (userManager.isLoggedIn() ? "TRUE" : "FALSE") );
}
LOGSTORE.debug( " doPhaseFilter() - START REDIRECT " );
response.sendRedirect( request.getContextPath() + "/" + homepage + "?auth-failed" );
}
return false;
} else
{
LOGSTORE.debug( "loggedIn().3 it is " + homepage );
return true;
}
}