Аналогичен ответу на bouncyball, но он сохраняет порядок столбцов и использует универсальный идентификатор в случае, если (LoB, AY) не является первичным ключом:
df %>%
mutate(id = 1:n()) %>%
gather(old_name, value, starts_with("R_")) %>%
arrange(id, nchar(old_name), old_name) %>%
group_by(id) %>%
mutate(value = cumsum(value)) %>%
ungroup() %>%
select(-id) %>%
spread(old_name, value) %>%
select(names(df)) %>%
select(AY, everything())
Добавьте ключ защиты к своим объектам, составьте таблицу для полномочий и свяжите пользователя с разрешением с entitytype и также с ключом защиты с ролью. Таким образом, можно сказать вещи как: Admin_role могут получить доступ к Студенту (тип Entitiy) и действительно читают (Операция в Разрешении) и Запись (Операция), в то время как Student_role может получить доступ к Student_key для him-/herself и Read_permission. Можно зафиксировать адрес путем рефакторинга этого в объект и добавления ключа защиты к нему.
Ваш номер четыре мог иметь предположение закрытого мира и сказать, что, если Вы не можете для текущей роли пользователя, связать имя свойства с флагом в словаре (entity+property) - хеш для установки флага причем закрытое мировое предположение - который чтения не позволяются по умолчанию. Затем, конечно, Вы не получаете полномочий записей и т.д.
Можно определить представления в базе данных и присвоить права им использующий систему аутентификации базы данных. Это - вероятно, большая часть очевидного способа, если Вы можете кодировать себя, способ выбрать, какое представление назвать, в зависимости от которой роли мы. (Мой бывший учитель RDBMS любил бы меня в то, что я сказал это ;)) Это также уходит немного от, в спящем режиме, и связывает Ваш материал больше с базой данных. Это зависит от того, насколько подвижный/портативный Ваш код должен быть, я предполагаю.
Используйте аспект вокруг своего универсального дао (IRepository), который переписывает запросы на основе Ваших полномочий; это подразумевает, что у Вас есть основанная на разрешении безопасность в коде, конечно.
Кнопка редактирования, скрывающаяся в gui, может действительно только быть сделана при первом портировании полномочий кодировать, как в моей точке 1. Я предлагаю, чтобы Вы взглянули на блог Ayendes для реализации с открытым исходным кодом этого, он - очень квалифицированный кодер.
Другая опция могла бы состоять в том, чтобы использовать пользовательские типы. Например, вместо того, чтобы отобразить символ на Строку, отобразите его на пользовательский тип как SecureString. Дайте ему параметр с некоторым уникальным идентификатором в отображении, например, table.column. Затем в nullSafeGet методе пользовательского типа, можно обратиться к службе безопасности, чтобы видеть, заполнить ли значение или просто установить его в NULL. Необходимо было бы проуспешно также использовать ThreadLocal для хранения чего-то для идентификации пользователя или роли. Необходимо было бы только создать горстку пользовательских типов для обертывания строки, дважды, даты, целого числа, и т.д. Я сделал что-то подобное, чтобы позволить датам быть преобразованными в часовой пояс пользователя.
Мне нравится предложение Henrik использования представлений.
Будьте в спящем режиме фильтры могли бы работать, но я думаю, что это больше для того, чтобы отфильтровать строки, а не столбцы.