多数据库应用程序ACL(第2部分)

时间:2014-08-18 01:34:03

标签: xpages lotus-notes acl

我发布了这个问题Access Control with a multi database application 所以我尝试将它应用到应用程序中。情况就是这样。我有一个mainDB,它有一个没有定义角色的ACL。用户单击一个按钮,它会打开一个CRUD控件,其数据源具有计算文件路径到另一个数据库,称为appDB。在appDB中,ACL定义了多个角色,我已将自己添加到ACL中,并为我分配了角色[Admin]和[Finance]。在此控件中,我添加了After Page Load事件,该事件执行以下操作:

var roles = context.getUser().getRoles();
viewScope.put("vsRoles", roles);

打开页面时,viewScope vsRoles为[],因此它无法识别我在appDB中有一组额外的角色。因此,当我登录mainDB.nsf时,context.getUser()。getRoles()只会在身份验证时获取我的角色,并且在我打开appDB时没有获取角色。我需要使用角色来配置一个人可以执行的操作,以及用户可以阅读和/或编辑哪些文档。

为了使问题复杂化,用户可以在多个目标应用程序数据库之间切换,并且无疑将具有不同的角色和访问每个目标应用程序数据库。 感谢您对我之前的问题的回复,但我可能没有详细解释过它。

1 个答案:

答案 0 :(得分:2)

因此,据我所知,您需要了解用户对appDb的具体角色。

context.getUser().getRoles()提供有关当前应用程序的信息(在您的情况下为mainDB.nsf)。您正在数据源级别访问appDB.nsf。您可以使用java方法来了解特定用户在目标数据库中的角色:

public static List<String> getRoles(Database targetDb, String userName) {
    ACL acl=null;
    List<String> roles=new ArrayList<String>();

    try {
        acl=targetDb.getACL();
        roles.addAll(targetDb.queryAccessRoles(userName));
    } catch (NotesException e) {
        // failed, nothing to do...
    } finally {
        if(acl!=null) acl.recycle();
    }

    return roles;
}

举个例子:

Session session=ExtLibUtil.getCurrentSession();
Database appDb=session.getDatabase("", "appdb.nsf");

// Make sure appDb is not null...

List<String> roleList=getRoles(appDb, session.getEffectiveUserName());
ExtLibUtil.getViewScope().put("vsRoles", roleList);