Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpages 多数据库应用程序ACL(第2部分)_Xpages_Lotus Notes_Acl - Fatal编程技术网

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

Xpages 多数据库应用程序ACL(第2部分),xpages,lotus-notes,acl,Xpages,Lotus Notes,Acl,我发布了这个问题 所以我试着把它应用起来。情况就是这样。我有一个mainDB,它有一个没有定义角色的ACL。用户单击一个按钮,它打开一个CRUD控件,其中包含一个数据源,该数据源具有到另一个数据库的计算文件路径,该数据库称为appDB。在appDB中,ACL定义了几个角色,我将自己添加到ACL中,并为我分配了角色[Admin]和[Finance]。在此控件中,我添加了一个页面加载后事件,该事件执行以下操作: var roles = context.getUser().getRoles(); vi

我发布了这个问题 所以我试着把它应用起来。情况就是这样。我有一个mainDB,它有一个没有定义角色的ACL。用户单击一个按钮,它打开一个CRUD控件,其中包含一个数据源,该数据源具有到另一个数据库的计算文件路径,该数据库称为appDB。在appDB中,ACL定义了几个角色,我将自己添加到ACL中,并为我分配了角色[Admin]和[Finance]。在此控件中,我添加了一个页面加载后事件,该事件执行以下操作:

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

使问题复杂化的是,用户可能会在多个目标应用程序数据库之间切换,并且无疑会有不同的角色和对每个数据库的访问权限。
感谢您对我上一个问题的回答,但我可能没有对其进行足够详细的解释。

因此,据我所知,您需要了解用户在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;
}
publicstaticlist getRoles(数据库targetDb,字符串用户名){
ACL ACL=null;
列表角色=新的ArrayList();
试一试{
acl=targetDb.getACL();
roles.addAll(targetDb.queryAccessRoles(用户名));
}捕获(注e){
//失败了,无事可做。。。
}最后{
如果(acl!=null)acl.recycle();
}
返回角色;
}
例如:

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);
会话会话=ExtLibUtil.getCurrentSession(); 数据库appDb=session.getDatabase(“,“appDb.nsf”); //请确保appDb不为空。。。 List roleList=getRoles(appDb,session.getEffectiveUserName()); ExtLibUtil.getViewScope().put(“vsRoles”,roleList);
@Serdan谢谢你的帮忙。我在页面上有许多按钮,我使用persons角色来确定显示哪些按钮。我还没有这样做,但我假设如果我在appDB的Reader或Author字段中有一个角色,那么这些角色将根据appDB中的分配角色强制执行。将不得不进行更多的测试。-->ThanksI能够将它添加到我已经拥有的处理应用程序属性的Bean中,因此实际上我不需要向getRole方法传递任何东西。public List getRoles(){List roles=new ArrayList();try{Session Session=ExtLibUtil.getCurrentSession();String userName=Session.getEffectiveUserName();roles.addAll(this.getAppDB().queryAccessRoles(userName));}catch(notesexceception e){//失败,无事可做…}ExtLibUtil.getViewScope().put(“vsRoles”,roles);return roles;}getRoles不能是静态的。是否将其设置为静态取决于您的实现。我对此类方法使用单独的实用程序类,以便在不同的数据库上重用它们。