我发布了这个问题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时没有获取角色。我需要使用角色来配置一个人可以执行的操作,以及用户可以阅读和/或编辑哪些文档。
为了使问题复杂化,用户可以在多个目标应用程序数据库之间切换,并且无疑将具有不同的角色和访问每个目标应用程序数据库。 感谢您对我之前的问题的回复,但我可能没有详细解释过它。
答案 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);