如何防止某些用户从Lotus视图中打开文档?

时间:2015-04-22 10:46:45

标签: lotus-notes lotusscript lotus lotus-formula

我有:

  • 一个包含大量文档的Lotus视图
  • 每个文档上的字段X,其中包含应该能够打开此文档的用户。

如何为除了提交的X中列出的用户以外的所有用户打开特定文档? 我想这可以通过QueryOpenDocument事件来完成,但是如何构建代码需要一些帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

QueryOpenDocument,查看选择公式和其他类似的内容并不是防止用户将文档作为安全措施打开的好方法。

用户可以创建个人视图或将数据库和/或文档复制到其他地方(flash usb等)。

安全措施应包括:

  1. Encryption(通过公共和/或秘密加密密钥)
  2. Readers访问,通过Readers字段(特殊字段,其内容是授权用户的用户名,可以阅读此文档)。
  3. 在某些情况下,您可能需要阻止打开文档,不是出于安全原因,而是为了解决特定任务。

    例如,如果您的视图显示不应以任何形式打开的文档。

    在这种情况下,在设计器中打开视图,转到QueryOpenDocument并添加一些代码:

    Sub Queryopendocument(Source As Notesuiview, Continue As Variant)
        Dim doc2BeOpened As NotesDocument
    
        Set doc2BeOpened =  Source.Documents.getFirstDocument()
    
        'checking MyField value to decide, open or not open the document
        If doc2BeOpened.MyField(0) = "some value" Then
            continue = False 'preventing `open document` action
        End If
    End Sub
    

    要允许打开文档,请确保Continue变量等于True。默认情况下为True

    <小时/>

    更新№1

    如果您的文档包含常用用户名列表,则可以使用以下代码:

    Sub Queryopendocument(Source As Notesuiview, Continue As Variant)
    
        Dim session As New NotesSession
        Dim userName As String
        Dim whoAllowed2ViewDoc As Variant
    
        Dim doc2BeOpened As NotesDocument
    
        userName = session.CommonUserName
    
        Set doc2BeOpened =  Source.Documents.getFirstDocument()
    
        'let say your field name is AllowedPeopleNames
        'you can use doc2BeOpened.AllowedPeopleNames or doc2BeOpened.GetItemValue("AllowedPeopleNames")
        'both (without (0) at the end, will return you a variant array with names)
        whoAllowed2ViewDoc = doc2BeOpened.GetItemValue("AllowedPeopleNames")
    
        If Not Isnumeric(Arraygetindex(whoAllowed2ViewDoc, userName)) Then
            continue = False 'preventing `open document` action if userName is not listed in whoAllowed2ViewDoc array   
        End If  
    End Sub
    

    请注意,上面的代码适用于普通用户名。

    • John Smith - 是一个常用用户名
    • John Smith\IT\Acme - 缩写为username
    • CN=John Smith\OU=IT\O=Acme - 是完全限定名称(规范形式)。

    要获取完全限定名称(也称为canonical表单),您可以使用session.username 要获得名称的缩写形式,获取完全限定的用户名,然后使用NotesName类,使用完全限定名称作为参数构建,然后从中获取名称的缩写形式。

    Dim notesName as NotesName
    Dim abbreviatedUserName as String
    
    Set notesName = New NotesName( fullyQualifiedName )
    abbreviatedUserName = notesName.Abbreviated
    

    <小时/>

    更新№2

    检查数组中的用户名存在时要小心。首先需要确定用于名称的表单,存储在该(字段)数组AllowedPeopleNames中。

    如果此数组中的名称如下所示:

    "John Smith"
    "Luis Brown"
    "Antony Stoppard"
    

    然后此数组包含常用用户名,您需要获取用户名以进行检查:

    Dim session as New NotesSession
    Dim username as String
    
    username = session.CommonUserName
    

    如果此数组中的名称如下所示:

    "John Smith/IT/Acme"
    "Luis Brown/IT/Acme"
    "Antony Stoppard/IT/Acme"
    

    然后此数组包含缩写形式的名称。您需要使用此方法获取用户名以进一步检查:

    Dim session as New NotesSession
    Dim notesName as New NotesName(session.username)
    Dim username as String
    
    username = notesName.abbreviated
    

    如果此数组中的名称如下所示:

    "CN=John Smith/OU=IT/O=Acme"
    "CN=Luis Brown/OU=IT/O=Acme"
    "CN=Antony Stoppard/OU=IT/O=Acme" 
    

    然后它包含规范形式的名称。你应该使用以下方法获得用于检查此数组的用户名:

    Dim session as New NotesSession
    Dim username as String
    
    username = session.username
    

    希望这有帮助。