Быстрое обновление прав при добавлении пользователя в группу

Gandliar

Lotus Team
16.02.2004
567
26
BIT
128
Здравствуйте!

Пользователя добавляют в группу в адресной книге.
Можно ли как то форсировать применение новых прав у пользователя, у которого уже запущен клиент.
Сейчас, чтобы заработали новые права надо перезайти пользователю в лотус.
Можно ли как то применить новые права без перезахода в лотус пользователем?
 
  • Нравится
Реакции: Domino-Designer и VladSh

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
Хороший вопрос! Меня это тоже всегда интересовало :)
 

swyatogor

Green Team
24.02.2014
594
24
BIT
4
неа.. клиент узнает, что пользователь в новой группе только после перезапуска сессии.. ну и соответственно все права от туда возьмет..
 

NetWood

Lotus Team
17.04.2008
565
96
BIT
174
О! Это ключевой момент регистрации. Я при заводе нового веб юзера шлю ему ссыль в письме вот такого вида

Код:
        site   = web.session.DocumentContext.Server_Name(0)
        webdbname = Evaluate("@WebDbName")
        confirmlink = "http://"+site+"/"+webdbname(0)+"/PersonConfirm?Open&id="+ Cstr(web.session.DocumentContext.DocUNID(0))
...
        Set rtitem = New NotesRichTextItem (mail,"Body")
        If ( rtitem.Type = RICHTEXT ) Then
            Call rtitem.AppendText(Chr(10))
            Call rtitem.AppendText("= Для окончания регистрации необходимо перейти по ссылке =" & Chr(13))                    
            Call rtitem.AppendText(confirmlink & Chr(13))
...

и в агенте PersonConfirm чекаю id на предмет темповой регистрации и делаю Refresh ($LDAPCN) и ($ServerAccess). Когда юзеров в поле группы становится много, то добавляется новая группа в AddUserToGroup
Код:
        ...
        Set dbreg = s.GetDatabase("",profile.GetItemValue("NABFile")(0)) 'Линк на базу в DA в котрой сохраняем имена юзеров 'da\webnames.nsf'
        Set dbreggroup = s.GetDatabase("",profile.GetItemValue("NABGroupFile")(0)) 'Линк на базу с группами
        Set viewreg=dbreg.GetView("($Users)")
 
        'add people document
        Set docpeople = dbreg.CreateDocument
        docpeople.Form="Person"
        docpeople.Type="Person"
        docpeople.UserName=username
 
        'some fields for standard domino directories
        'docpeople.Fullname=username  ' это с емайлом запишем
        '' для авторизации по Fullname или по Email
          '==================
        Dim namesArray ( 1 To 3 ) As String
        namesArray( 1 ) = username
        namesArray( 2 ) = userdoc.GetItemValue("Email")(0)
        Call docpeople.AppendItemValue( "Fullname", namesArray )
        '==========================
 
        docpeople.Lastname=userdoc.GetItemValue("UserName")(0)
        docpeople.MailAddress = userdoc.GetItemValue("Email")(0)    
        docpeople.HTTPPassword=userdoc.GetItemValue("HTTPPassword")(0)
        ' и город на всякий случай
        Call docpeople.ReplaceItemValue("dspCity" ,userdoc.GetItemValue("ProfileField2")(0))
 
        'add user to group
        addtogroup =  AddUserToGroup (username , profile.GetItemValue("NABGroup")(0)) 'Имя группы, в которую добавляем юзера
        ''в группу e-mail не работает! только username ''addtogroup =  AddUserToGroup (userdoc.GetItemValue("Email")(0) , profile.GetItemValue("NABGroup")(0))
        If addtogroup=True Then
            Call docpeople.ComputeWithForm(True,False)
            Call docpeople.Save(True, False)
        End If

        ''========= start обновить представление names ========
        'Refreshing NAB views for immediate login
        Call viewreg.Refresh()
        Set view = dbreg.GetView("($LDAPCN)")
        Call view.Refresh()
        Set view = dbreg.GetView("($ServerAccess)")
        Call view.Refresh()
 
    %REM
        ''А можно и так updated immediately
        Set dbNab = s.GetDatabase(db.Server, profile.GetItemValue("NABFile")(0))
        Set dbMainNab = s.GetDatabase(db.Server, "names.nsf")
        ''OpenNTF uses two Directories, where the person docs are created in the DA directory
        ''and the group maintenance occurs in the Main Directory (names.nsf)
        ''we therefore need to make sure the appropriate views in both get updated immediately
        dbNab.DelayUpdates = False
        dbMainNab.DelayUpdates = False 'KP addd this line to ensure the group views are updated in main nab
 
        Dim nabFullNameView As NotesView
        Dim nabServerAccessView As NotesView
        Dim nabUserView As NotesView
        Dim MainnabFullNameView As NotesView
        Dim MainnabServerAccessView As NotesView
 
        Set nabFullNameView = dbNAB.GetView("($LDAPCN)")
        Set nabUserView = dbNAB.GetView("($Users)")
        Set nabServerAccessView = dbNAB.GetView("($ServerAccess)")
        Set MainnabFullNameView = dbMainNAB.GetView("($VIMPeople)")
        Set MainnabServerAccessView = dbMainNAB.GetView("($ServerAccess)")
 
        Call nabFullNameView.Refresh
        Call nabUserView .Refresh
        Call nabServerAccessView.Refresh
        Call MainnabFullNameView.Refresh
        Call MainnabServerAccessView.Refresh
%END REM
 
        ''========= конец обновить представление names ========
Код:
Function AddUserToGroup (username As String , basegroup As String) As Boolean

    Dim ServerNum As String
    Dim saveGroupMainDoc As Integer

     'Get group view
    Set view = dbreggroup .GetView("Groups")
    Set docGroup = view.Getdocumentbykey(basegroup)
    If (docGroup Is Nothing) Then
        Set docGroup = dbreggroup.CreateDocument
        Call docGroup.ReplaceItemValue("Form", "Group")
        Call docGroup.ReplaceItemValue("ListName", basegroup)
        Call docGroup.ReplaceItemValue("Members",  basegroup & "#1")
        Call docGroup.ReplaceItemValue("GroupType", "0")
        Call docGroup.ReplaceItemValue("ListDescription", "Do not edit this group manually, it is updated via an agent.")
        Call docGroup.ComputeWithForm( False, False )
        Call docGroup.Save(False, False)
    End If

    'Adds a user to a group.
    Dim groupMainMembers As NotesItem
    Dim groupMainName As String
    Set groupMainMembers = docGroup.GetFirstItem( "Members" )
    groupMainName = docGroup.GetItemValue("ListName")(0)
     ' Find last subgroup entry in the members list
    Dim subGroup As String
    subGroup = ""
    Forall s In groupMainMembers.Values
        If Left$( s, Len( groupMainName  ) ) = groupMainName Then subGroup = s
    End Forall
     ' Open the subgroup, and keep trying until we find one with room
    Dim groupNum As Integer
    groupNum = 0
     ' Which subgroup was the last one
    If subGroup <> "" Then
        groupNum = Val( Right( subGroup, Len( subGroup ) - Len( groupMainName ) - 1 ) )
    Else
        groupNum = 1
        subGroup = groupMainName  & "#1"
    End If

    Dim groupSubDoc As NotesDocument
    Do
        Set groupSubDoc = view.GetDocumentByKey( subGroup )
        If groupSubDoc Is Nothing Then
            Set groupSubDoc = dbreggroup.CreateDocument
            Call groupSubDoc.ReplaceItemValue("Form", "Group")
            Call groupSubDoc.ReplaceItemValue("ListName", subGroup)
            Call groupSubDoc.ReplaceItemValue("GroupType", "0")
            Call groupSubDoc.ComputeWithForm( False, False )
               ' Add it to the main group if needed
            If Not groupMainMembers.Contains( subGroup ) Then
                Call groupMainMembers.AppendToTextList( subGroup )
                saveGroupMainDoc = True
            End If
        End If
          ' See if the subgroup still has room, if so, we've found our subgroup
        Dim groupSubMembers As NotesItem
        Set groupSubMembers = groupSubDoc.GetFirstItem("Members")
        If groupSubMembers Is Nothing Then ' notes administrator seems to delete the item if nomore elements
            Call groupSubDoc.ReplaceItemValue("Members","")
        Else
            If groupSubMembers.ValueLength < 14000 Then Exit Do
             ' If no room, try the next one
            groupNum = groupNum+1
            subGroup = groupMainName & "#" & groupNum
        End If
    Loop

     'add the user to the subgroup
    Call groupSubMembers.AppendtoTextList(username)
    Call groupSubDoc.Save( False, True )

    'Save main group if we just added a subgroup name
    If saveGroupMainDoc = True Then Call docGroup.Save(True,False)

    AddUserToGroup =True

End Function

Все обновляется и сразу регается.
Сегодня как раз задавал вопрос по DA Дополнительная авторизация по группе в DIRECTORY ASSISTANCE?
 
Последнее редактирование:

swyatogor

Green Team
24.02.2014
594
24
BIT
4
для вэб интерфеса и первичной регистрации это один вопрос.. первоначально именно для толстого клиента спрашивалось и уже работающего пользователя.. а тут без вариков..
 

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
46
sh nlcache reset не пробовали в консоли?
Ну и drop all для верности...
 
30.05.2006
1 345
12
BIT
0
Права (разрешения) кешируются на клиенте. И даже если на сервере появились новые ресурсы для данного юзера, клиент туда НЕ сунется (до перезапуска)!
 
  • Нравится
Реакции: swyatogor

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
И даже если на сервере появились новые ресурсы для данного юзера, клиент туда НЕ сунется (до перезапуска)!
Это на самом деле происходит, только очень редко - ждать надо от часа и далее.
И перегружаться необязательно, достаточно обрубить у пользователя сессию (права вычитываются при создании сессии пользователя на сервере).
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!