基于remote_user / session属性在facelet中显示用户配置文件

时间:2013-12-09 23:29:32

标签: java jsf session java-ee

我正在尝试在facelet页面上显示存储在Oracle中的用户配置文件数据。但我不知道如何在托管bean中的Session中指定用户ID(下面的@PostConstruct中的“myUserId”)。

的facelet

receiving email? #{member.receive_email} <br/>
signed waiver? #{member.signed_waiver} <br/>

托管Bean / Backing Bean(不确定正确的术语)

@SessionScoped
public class MemberProfile implements Serializable {

@Inject
private EntityManager em;
private Member member;

@Produces
@Named
public Member getMember() {
  return member;
}

@PostConstruct
public void getMemberData() {
  CriteriaBuilder cb = em.getCriteriaBuilder();
  CriteriaQuery<Member> criteria = cb.createQuery(Member.class);
  Root<Member> _member = criteria.from(Member.class);

  criteria.select(_member);
  criteria.where(cb.equal(_member.get("userid"), "myUserId"));
  member = em.createQuery(criteria).getSingleResult();
}

当我对用户ID进行硬编码时,它可以工作,但我想查询登录的用户。好吧,没有人真正登录到他们的PC的Web应用程序。在我的公司,IT已经设置Apache使用Kerberose和Active Directory并将其发送给JBoss。所以我通过request.getAttribute("REMOTE_USER")

拥有用户ID

我有一个servlet过滤器,它读取request.getAttribute(“REMOTE_USER”)并设置一个对象User,它在httpsession中有基本的员工数据(电话,电子邮件,姓名等)。现在,成员资料来自另一个Oracle桌面,用于员工滑雪俱乐部应用程序。

在facelet中,我可以像这样访问用户数据:

Hello: ${STKUserSession.fname }&nbsp;${STKUserSession.lname }&nbsp;(${STKUserSession.userId})   

那么如何在上面的查询构建器中使用此STKUserSession.userId。也许我无法理解,因为我一直在使用错误的方法

修改

基于下面的答案,建议是这样做,但我不确定这是最干净的方法。

     HttpServletRequest httpRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
     HttpSession session = httpRequest.getSession();
     STKUser authenticatedUser = (STKUser) session.getAttribute("STKUserSession");
     String autheticatedBadge = authenticatedUser.getBadge();
     criteria.where(cb.equal(_member.get("badge"), autheticatedBadge));

2 个答案:

答案 0 :(得分:1)

您可以使用

检索发出请求的用户名
FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();

FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName();
  

那么如何在查询构建器中使用此STKUserSession.userId   以上。也许我无法理解,因为我使用了错误   完全接近

只需将从上述方法之一检索到的用户名作为参数传递到sql查询中,类似以下内容应该有效:

criteria.where(cb.equal(_member.get("userId", FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName())));

答案 1 :(得分:1)

这就是我要做的事情:

1)为STKUser对象创建一个持有者对象:

@Named("STKUserSession")
@SessionScoped
public class STKUserSession implements Serializable {
    private STKUser instance;

    @PostConstruct
    public void init() {
        instance = new STKUser(Faces.getRequestAttribute("REMOTE_USER"));
    }
    // facade methods for STKUser
}

2)使用STKUserSession对象获取您的个人资料:

@Named
@SessionScoped
public class MemberProfile implements Serializable {
    @Inject
    private STKUserSession user;

    @PersistenceContext
    private transient EntityManager em;

    private Member member;

    @PostConstruct
    public void init() {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Member> cq = cb.createQuery(Member.class);
        Root<Member> root = cq.from(Member.class);

        cq.where(cb.equal(root.get("badge"), user.getBadge()));
        member = em.createQuery(cq).getSingleResult();
    }
}

请注意,这是演示代码:您可能希望错误检查丢失的徽章,捕获getSingleResult()引发的异常(或使用getResultList())。它还使用omnifaces快捷方式。

另外,检查周期:如果将MemberProfile注入STKUserSession使用的bean,您的CDI实现会抱怨。