diff --git a/internal/lkgateway/admin.go b/internal/lkgateway/admin.go
index d761e6f..e0b654b 100644
--- a/internal/lkgateway/admin.go
+++ b/internal/lkgateway/admin.go
@@ -87,6 +87,12 @@ var templateFuncs = template.FuncMap{
v, certs := setupProbes(globalRC)
return v != "" && certs > 0
},
+ "avatarLetter": func(s string) string { // первая буква имени — для кружка в списке сотрудников
+ for _, r := range strings.TrimSpace(s) {
+ return strings.ToUpper(string(r))
+ }
+ return "?"
+ },
"adDraft": adDraftForView, // неудачная попытка подключить домен — форма открывается заполненной
"withRet": func(d any, ret string) map[string]any { return map[string]any{"D": d, "Ret": ret} },
"whForm": func(w WorkHoursSettings, ret string) map[string]any { return map[string]any{"W": w, "Ret": ret} },
diff --git a/internal/lkgateway/web/templates/admin_setup.html b/internal/lkgateway/web/templates/admin_setup.html
index fbe5b0b..5f9c41b 100644
--- a/internal/lkgateway/web/templates/admin_setup.html
+++ b/internal/lkgateway/web/templates/admin_setup.html
@@ -107,51 +107,60 @@
{{$U := .Users}}{{$A := .Settings.Auth}}
Пользователи и вход
-
Кто может входить в bj и что ему разрешено. Вход — локальной учётной записью или доменной (Active Directory), роль доменного пользователя назначается по его группам AD.
+
Кто может входить в bj и что ему разрешено. Сотрудник входит своей учётной записью bj или доменной (Active Directory) — тогда пароль проверяет домен.
{{if $U.Open}}
Вход пока не требуется: пользователи не созданы. Создайте первого администратора — после этого все страницы потребуют входа.
{{end}}
-
Роли
+
Сотрудники ({{len $U.Users}})
+ {{if $U.Users}}
+ {{range $U.Users}}
+
+
+ {{avatarLetter (or .Name .Login)}}
+ {{if .Name}}{{.Name}}{{else}}{{.Login}}{{end}}{{.Login}}{{if .Email}} · {{.Email}}{{end}} · {{if eq .Source "ad"}}доменная учётная запись{{else}}пароль в bj{{end}} · {{if not .LastLogin.IsZero}}вход {{msk .LastLogin}}{{else}}ещё не входил{{end}}
+ {{if not .Active}}заблокирован{{end}}
+ {{if $U.RoleShown .Role}}{{roleTitle .Role}}{{else}}{{$U.RoleNote .Role}}{{end}}
+ Изменить
+
+
+
+ {{end}}
{{else}}
Пока никого — добавьте сотрудника ниже.
{{end}}
+
+
+
+
{{if $U.Open}}Создать первого администратора{{else}}Добавить сотрудника{{end}}
+
+ Расширенные настройкироли и права, домен вручную: контроллер, сертификат, группы, перепроверка, время сессии
+
Роли и права
Роль
Что разрешено
{{range $U.Roles}}
{{.Title}} {{.Key}}
{{.Desc}}
{{end}}
{{range $U.Hidden}}
{{.Title}}
Недоступна: в лицензии нет модуля «{{.Missing}}».
{{end}}
{{if $U.Modules}}Подключённые модули ({{range $i, $m := $U.Modules}}{{if $i}}, {{end}}«{{$m.Title}}»{{end}}) можно выдать любому пользователю дополнительно к роли. {{end}}Роли и модули показываются по лицензии: права модуля, которого нет в лицензии, не действуют. Настройки и пользователи — только администратор.
-
-
-
-
Пользователи ({{len $U.Users}})
- {{range $U.Users}}
-
- {{else}}
Пользователей нет.
{{end}}
-
-
{{if $U.Open}}Создать первого администратора{{else}}Добавить пользователя{{end}}
-
-
Доменного пользователя можно заранее завести с источником «Active Directory», чтобы выдать ему модули; роль при входе возьмётся из групп AD. Если потерян доступ администратора — удалите файл /var/lib/bj/.bj/users.json на сервере: система вернётся в режим первичной настройки.
-
-
-
-
Вход через Active Directory
+
Вход через Active Directory
bj подключается к контроллеру домена и проверяет пароль пользователя (LDAP bind его же учётной записью). Роль назначается по членству в группах AD, включая вложенные. Пользователь появляется в списке при первом входе. Чтобы изменения групп действовали без повторного входа, укажите сервисную учётную запись только на чтение: bj будет перечитывать группы доменных пользователей по расписанию, менять роль и снимать доступ у удалённых из групп.
-
+
-
+
-
-
+
+
-
Группы AD → роли (имя группы или полный DN; первое совпадение сверху)
+
Группы домена → роли имя группы или полный DN; действует первое совпадение сверху
Без логина и пароля проверяется только доступность контроллера. С логином — вход, группы и вычисленная роль. Пароль проверки никуда не сохраняется.
{{$R := $U.ADRecheck}}
{{if and $A.ADEnabled $A.ADBindUser $A.ADBindPassword}}
Перепроверка групп каждые {{if $A.ADRecheckMinutes}}{{$A.ADRecheckMinutes}}{{else}}15{{end}} мин: {{if $R.At.IsZero}}ещё не выполнялась{{else}}последняя {{msk $R.At}}, проверено {{$R.Checked}}, изменений {{$R.Changed}}{{if $R.Err}} — ошибка: {{$R.Err}}{{end}}{{end}}
-
+
{{else}}Перепроверка групп выключена: роль доменного пользователя меняется только при следующем входе. Укажите сервисную учётную запись выше.{{end}}
-
-
-
-
Активные сессии ({{len $U.Sessions}})
- {{if $U.Sessions}}
Пользователь
Вход
Активность
Адрес
Браузер
- {{range $U.Sessions}}
{{.Login}}
{{msk .Created}}
{{msk .Seen}}
{{.IP}}
{{.UA}}
-
{{end}}
-
{{else}}
Сессий нет.
{{end}}
+
Если потерян доступ администратора — удалите файл /var/lib/bj/.bj/users.json на сервере: система вернётся в режим первичной настройки.
У каждого, кто работает с bj, — своя учётная запись: свой пароль и свои права, а в журнале видно, кто что сделал. Заведите сотрудников по ролям; права, пароли и вход через Active Directory меняются позже в разделе Настройка → Пользователи.
Группы домена с доступом в bj — их сотрудники входят без отдельной учётной записи:
- {{range $A.ADGroups}}
{{.Name}} → {{roleTitle .Role}}
-
{{end}}
-
{{end}}
-
- {{end}}
- {{if and $A.ADEnabled $A.ADBindUser}}Другой домен или учётная запись{{else}}Подключить домен{{end}}
- {{/* пароль в страницу не попадает никогда — только пометка, что он есть */}}
- {{$bu := $A.ADBindUser}}{{$pw := ""}}{{if $A.ADBindPassword}}{{$pw = "задан"}}{{end}}{{$fs := ""}}{{$fd := ""}}{{$adv := false}}
- {{if $D}}{{$bu = $D.BindUser}}{{$pw = ""}}{{if $D.HasPassword}}{{$pw = "введён"}}{{end}}{{$fs = $D.Form.Server}}{{$fd = $D.Form.Domain}}{{$adv = $D.Form.Adv}}{{end}}
-
Введите учётную запись домена и пароль — домен и его контроллеры bj найдёт сам. Прав администратора домена не нужно; лучше отдельная служебная запись (например svc-bj): bj хранит её пароль, чтобы искать сотрудников.
-
-
- {{if $D}}
Не подключено: {{$D.Err}}{{if not $D.Cert}} Поправьте и нажмите «Подключить» ещё раз — введённое сохранено.{{end}}
Группы домена с доступом в bj — их сотрудники входят без отдельной учётной записи:
+ {{range $A.ADGroups}}
{{.Name}} → {{roleTitle .Role}}
+
{{end}}
+
{{end}}
+
+ {{end}}
+ {{if and $A.ADEnabled $A.ADBindUser}}Другой домен или учётная запись{{else}}Подключить домен{{end}}
+ {{/* пароль в страницу не попадает никогда — только пометка, что он есть */}}
+ {{$bu := $A.ADBindUser}}{{$pw := ""}}{{if $A.ADBindPassword}}{{$pw = "задан"}}{{end}}{{$fs := ""}}{{$fd := ""}}{{$adv := false}}
+ {{if $D}}{{$bu = $D.BindUser}}{{$pw = ""}}{{if $D.HasPassword}}{{$pw = "введён"}}{{end}}{{$fs = $D.Form.Server}}{{$fd = $D.Form.Domain}}{{$adv = $D.Form.Adv}}{{end}}
+
Введите учётную запись домена и пароль — домен и его контроллеры bj найдёт сам. Прав администратора домена не нужно; лучше отдельная служебная запись (например svc-bj): bj хранит её пароль, чтобы искать сотрудников.
+
+
+ {{if $D}}
Не подключено: {{$D.Err}}{{if not $D.Cert}} Поправьте и нажмите «Подключить» ещё раз — введённое сохранено.{{end}}