Java 如何获取登录用户';使用JDBCRealm的用户名?

Java 如何获取登录用户';使用JDBCRealm的用户名?,java,jsf,login,managed-bean,j-security-check,Java,Jsf,Login,Managed Bean,J Security Check,我正在运行Glassfish 3.0,并且正在实现用于登录身份验证的JDBCRealm。用户名和角色保存在名为usertable的表中。身份验证正在按预期工作 但是现在的问题是,当用户登录时,如何在应用程序中检索登录用户的用户名 PS:我正在实现JSF页面和托管Bean,或者独立于您用于身份验证的领域,因此如果您使用文件领域进行测试,使用JDBC领域进行生产,那么在这两种情况下都可以工作。顺便说一下,如果您使用JDBCRealm,还可以查看一下。您的身份验证方法应该返回一个java.securi

我正在运行Glassfish 3.0,并且正在实现用于登录身份验证的JDBCRealm。用户名和角色保存在名为usertable的表中。身份验证正在按预期工作

但是现在的问题是,当用户登录时,如何在应用程序中检索登录用户的用户名


PS:我正在实现JSF页面和托管Bean,或者独立于您用于身份验证的领域,因此如果您使用文件领域进行测试,使用JDBC领域进行生产,那么在这两种情况下都可以工作。顺便说一下,如果您使用JDBCRealm,还可以查看一下。

您的身份验证方法应该返回一个java.security.Principal,其中将包含名称


在JSF中,您可以使用对象检索与请求相关联的当前主体,从而检索当前会话,该对象可以从。可以使用以下方法从ExternalContext访问与请求关联的主体:

上述调用可以在JSF管理的bean中完成。您可以在主体对象上调用
getName()
方法,以字符串形式检索用户名称


请注意,如果您在身份验证之前检索主体,或者如果身份验证方案不保护整个站点,则可以获取引用匿名用户的
Principal
实例。

FacesContext.getExternalContext().getUserPrincipal()?它不应该像
FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal()?在撰写本文时,JSF的一些旧版本中是否存在这种情况?@Tiny,是的,如果没有FacesContext实例,必须首先调用
getCurrentInstance()
static方法。GlassFish的某些版本中是否存在这种FlexibleJDBCRealm?在该链接页面的末尾提到,“我一直与SUN保持联系,希望FlexibleJdbcRealm(或具有类似灵活性的东西)将添加到glassfish的未来版本中。”@tiny我不知道。但他表示,目前的版本也适用于GF4。
FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();