Следует ли неавторизованные действия в пользовательском интерфейсе скрывать, отключать или приводить к ошибке?

Для меня это извечный вопрос, который я никогда не решал, поэтому мне хотелось бы получить ваше мнение. Если у меня есть действия, которые, как я знаю, пользователь не сможет выполнить из-за недостаточных привилегий или состояния объекта, должны ли элементы пользовательского интерфейса для этих действий быть скрытыми от пользователя, видимыми, но отключенными, или видимыми и приводить к ошибке при попытке? Каков был бы смысл вашего ответа? Если отключено, не могли бы вы сообщить причину, почему, и если да, то как?

Это веб-интерфейс, поэтому я уже знаю, что мне нужно проверять входящую почту / получать разрешения и все равно обрабатывать ошибки там. Я в первую очередь говорю о том, как работать с пользовательским интерфейсом.

Это похоже на Правила отключения или скрытия пунктов меню, хотя меня интересуют все типы элементов пользовательского интерфейса, а не только меню.

Примеры:

  1. У меня есть новая страница, которая позволяет пользователю создавать новое событие. События могут быть главными событиями или подсобытиями. Для создания главного события требуется привилегия «EditMasterEvent», тогда как для создания вспомогательного события требуется только привилегия «EditEvent». У меня есть раскрывающийся список, который позволяет выбрать существующее событие в качестве родительского (основное событие) или не родительского (это основное событие). Должен ли вариант «Создать главное событие» отображаться в раскрывающемся списке или опускаться, если у пользователя есть только права «EditEvent».

  2. Для удаления событий требуется, чтобы вы были администратором приложения или имели соответствующие права на редактирование для данного типа события. В последнем случае мероприятие также должно быть старше 5 лет. Удаление события приводит к значительному каскадному удалению связанных данных в системе, и по юридическим причинам эти данные должны храниться не менее 5 лет после события. Поскольку эта операция выполняется редко для обычного пользователя, в типичном случае действие недоступно. Показывать его всегда или только тогда, когда это реально возможно?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
58
0
9 242
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

Я отключаю элементы вместо того, чтобы скрывать их. Таким образом, пользователь знает, что опция обычно доступна, и я предоставляю всплывающую подсказку, чтобы объяснить, почему этот элемент в настоящее время недоступен.

Вы делаете это, когда у пользователя никогда не будет возможности вызвать действие? То есть для действия требуется «DeletePermission», которого у пользователя нет, поэтому он никогда не сможет его выполнить?

tvanfosson 16.12.2008 20:02

Хороший момент - в таком случае я обычно скрываю это. Иногда неплохо не продвигать функциональные возможности, о которых пользователь не должен знать. :)

Jon Tackabury 16.12.2008 20:04

Не забудьте всплывающую подсказку! Нет ничего более раздражающего, чем видеть вариант, который вы хотите сидеть прямо здесь, но неактивный без каких-либо объяснений.

sep332 16.12.2008 20:15

Я думаю, что этот ответ слишком общий и применим не ко всем ситуациям. Это во многом зависит от того, какова цель элемента управления, насколько осведомлен (или нет) пользователь, а также от целого ряда факторов.

Bryan Oakley 16.12.2008 20:28

В зависимости от элемента мы либо скроем их, либо отключим. Если у пользователя есть доступ к большой функции, но не к меньшей части внутри нее, мы скроем меньшую часть. Однако, если у пользователя есть доступ к нескольким крупным функциям, но не к другим, мы оставим их видимыми, но отключенными, как маркетинговый ход, чтобы напомнить им, что функции доступны для покупки, если они решат, что они им нужны.

Отличный вопрос!

Пара соображений:

Если вы разместите элементы на странице, но отключите их, все еще существует небольшая вероятность того, что пользователь может вылечить систему и включить их с помощью javascriptlet.

Если вы их вообще не показываете, общая функциональность может немного сбить с толку обычного пользователя. "Разве здесь не должно быть кнопки редактирования?"

Если вы собираетесь отображать и отключать или отображать и проверять элементы, я бы сделал определенно проверку на стороне сервера. Не оставляйте проверку в руках JavaScript; Думаю, причины этого очевидны.

Верно. Я всегда выполняю проверку на стороне сервера как данных, так и разрешений.

tvanfosson 16.12.2008 20:12

Даже если вы полностью скроете элементы управления, все равно есть шанс, что опытный пользователь сделает эту функцию доступной для них, если не выполняется проверка сервера ...

Simon Bengtsson 11.08.2014 19:07

По-разному. Вы хотите, чтобы пользователь знал, что действие возможно, но не для него? В этом случае покажите им кнопку, но отключите ее. Например, если у пользователя нет полномочий на удаление, но есть у других пользователей, они должны знать, что записи МОГУТ быть удалены, поэтому они могут попросить кого-нибудь сделать это за них, если им нужно действие.

С другой стороны, если пользователь не должен даже знать о действии (например, пользователь, у которого нет доступа для чтения к журналам аудита, вероятно, не должен знать, что эти журналы существуют), не должен видеть кнопку , так что спрячьте это полностью.

Мне нравится идея оставить его доступным, когда вы согласны с тем, что пользователь знает, что это может быть сделано, но не им.

tvanfosson 16.12.2008 20:16

Я также видел некоторые программы, которые отключают этот пункт меню и меняют его текст на «Войдите, чтобы сделать мля ...»

Мне это нравится, потому что это не оставляет меня с вопросом «почему это не работает?» чувство и сразу говорит мне, что делать, чтобы заставить его работать. Применимо не во всех случаях, но это хороший подход, если вы можете его реализовать.

Особую ненависть к приложениям, отключающим кнопки. Если вы конечный пользователь - вы хотите знать, почему вы не можете использовать эту кнопку. Выделение его серым цветом ни о чем вам не говорит. Как добраться до состояния, чтобы включить его? Всплывающие подсказки - одно из решений, но они не самые лучшие, многие пользователи будут испытывать трудности с подсказками (если вы не работаете с опытными пользователями).

Конечно, это во многом зависит от контекста. Например, если у вас есть кнопки «воспроизведение» и «стоп», довольно очевидно, почему одна из них отключена, а другая включена. Наблюдение за их переключением при нажатии быстро научит вас их поведению. Не на все вопросы «почему это диабет» так легко ответить.

Bryan Oakley 16.12.2008 20:23

Также учтите тот факт, что иногда глаз будет воспринимать определенную комбинацию включенных и отключенных функций как ключ к состоянию программы. Вы можете использовать это в интересах пользователя. Все зависит от пользователей, их целей и богатства (или отсутствия такового) пользовательского интерфейса.

Bryan Oakley 16.12.2008 20:25
Ответ принят как подходящий

Как и почти на все вопросы пользовательского интерфейса, ответ - «это зависит от обстоятельств».

Помимо прочего, вам необходимо взвесить возможность обнаружения и удовлетворенность пользователей. Например, разрешение недопустимого действия дает вам возможность объяснить, почему что-то недопустимое. Это особенно полезно, если ответ на вопрос «почему это отключено» неочевиден. Это важно для приложения, в котором большинство пользователей являются новичками.

С другой стороны, может быть очень неприятно увидеть элемент управления, щелкнуть по нему и получить в награду сообщение «извините, вы не можете сделать это сейчас». В приложении, которое я унаследовал пару лет назад, было много подобных вещей, и использование пользовательского интерфейса превратилось в разочаровывающее упражнение.

Полное сокрытие функциональности, вероятно, редко бывает хорошей идеей. Представьте, что вы знаете, что какая-то функция «была здесь минуту назад», но теперь ее нет. Будь то пункт меню, кнопка на панели инструментов или что-то совсем другое, скрытие его может вызвать разочарование у конечного пользователя.

Попробуйте провести небольшое тестирование юзабилити, хотя бы спросив следующего человека, которого вы видите: «Эй, есть ли смысл отключить это или показать вам информативный диалог». Часто бывает достаточно одного другого мнения, чтобы заставить вас взглянуть на проблему с другой стороны.

Итог: делайте то, что лучше всего подходит пользователю. Все упомянутые вами сценарии действительны при определенных обстоятельствах. Как и в случае со всеми вопросами пользовательского интерфейса, спросите себя (или, что лучше, своих пользователей), что лучше всего соответствует их потребностям.

Хороший ответ. Я немного не согласен со скрытием. Конечно, в контексте, о котором вы говорите (скрытие операций, которые обычно видны), это разочаровывающий выбор - скрывать их, но вещи, которые никогда не доступны (см. Ответ Стивена К.), никогда не должны быть видимыми. Кроме того, если есть какие-либо операции, которые определенные группы пользователей (которые ваше приложение не различает внутри) никогда не будут использовать, должна быть возможность полностью их скрыть.

masterxilo 18.06.2014 10:42

Лично я считаю, что элементы должны присутствовать всегда. Если у пользователя недостаточно прав для их выполнения, он должен выдать ошибку при нажатии.

Я знаю, что переводчикам не очень нравится создавать миллионы различных сообщений об ошибках типа «доступ запрещен», поэтому это часто не делается в локализованных приложениях, которые вместо этого скрывают элементы.

На практике многие люди вместо этого скрывают параметры даже в нелокализованных приложениях.

Я склонен подходить к двум различным типам ситуаций по-разному. Это действие, которое регулируется привилегиями и состоянием объекта.

Если у человека недостаточно прав для выполнения действия, я скрываю эту опцию, он не знает, что может выполнить действие.

Если опция недоступна, потому что объект не находится в состоянии, которое может использовать эту опцию, я отключаю ее, позволяя опции быть видимой для пользователя, но никакие действия не могут быть выполнены.

Из ваших примеров:

  1. Я бы не выбрал вариант «Создать мастер-событие». У пользователя недостаточно прав для его просмотра.

  2. Я бы сделал кнопку «Удалить» видимой для администраторов. Затем, в зависимости от того, как вы делаете остальную часть сайта (много видимого текста, всплывающих подсказок, значка справки и т. д.), Я бы следовал этому соглашению об информировании пользователя, почему кнопка не может использоваться в настоящее время. И, возможно, включите таймер, расположенный выше, рядом с кнопкой, указывающей, сколько лет посту или сколько времени до его удаления.

Скрытый - это лучший подход для действий, которые никогда не доступны текущему пользователю. Нет смысла заставлять пользователя тратить умственные усилия на выяснение того, почему что-то отключено, если нет никаких действий, которые он может предпринять, чтобы это изменить.

Отключено - это лучший подход для действий, которые иногда доступны, но не в данный момент или в текущем контексте. Отключенный параметр должен означать две вещи: во-первых, действие недоступно прямо сейчас, а во-вторых, есть что-то, что пользователь может сделать, чтобы сделать действие доступным (изменить некоторые настройки или разрешения, выбрать элемент, ввести необходимые данные и т. д. ). Если вы можете указать во всплывающей подсказке, что нужно сделать, чтобы активировать действие - тем лучше. Включение / отключение действий при вводе данных пользователем или изменении контекста обеспечивает отличную обратную связь о том, что требуется программе.

Сбой с ошибкой - это худший вариант. Вы должны прибегать к отчету об ошибках только для операций, которые могут работать: вы не можете сказать, что он потерпит неудачу, кроме как попытавшись.

Общее правило - используйте отключение, если пользователь может что-то сделать в пользовательском интерфейсе, чтобы получить привилегию. Отключено означает, что «вы можете выполнять эту команду, но только не сейчас, как сейчас». «Как обстоят дела» включает в себя текущий выбор, поэтому используйте включение / отключение, если у пользователя есть привилегия EditEvent для старых объектов, но не для новых объектов. Должно быть четкое указание на то, какие объекты можно удалять, чтобы пользователи понимали, почему связанные команды отключены для некоторых объектов (например, если пользователи обычно знают, что записи должны храниться в течение 5 лет, может быть достаточно простого поля возраста, возможно, усиленного с графической разницей для записей старше 5 лет).

Используйте окна сообщений вместо отключения, если нет возможности объяснить причину отключения пользователю, предполагая, что он имеет средние знания о предметной области. Всплывающие подсказки для отключенных элементов управления, кстати, отличная идея, но их может быть недостаточно.

Используйте скрытие, если у пользователя никогда не было такой привилегии, независимо от того, что он делает в пользовательском интерфейсе, учитывая его текущее положение в организации (например, он не является администратором приложения). Использование в этом случае сообщений об отключении или окнах сообщений затруднительно и неприятно. Что касается пользователей, действия, на которые у них нет разрешения, не являются их работой (в противном случае у них была бы привилегия), и поэтому соответствующие элементы управления просто не должны существовать в их пользовательском интерфейсе. Руководства по документации или организационным процедурам могут сообщать пользователям, как выполняются такие действия (например, «Ваш руководитель создает для вас новые мероприятия»).

Подробности на http://www.zuschlogin.com/?p=40.

Я бы сказал, что отключите с указанием причины.

Это не дает пользователю задуматься о том, что, черт возьми, происходит, и в то же время дает ему знать, что определенные действия возможны при правильных условиях.

Другие люди дали хорошие ответы с действительным предложением избежать сокрытия элементов, а вместо этого отключить их и дать некоторые подсказки по причинам.

Итак, я хотел бы взглянуть на это с другой точки зрения - но как скрыть некоторые элементы пользовательского интерфейса в случаях, когда пользователю не нужно их видеть, независимо от того, есть ли у него разрешения на определенные действия, связанные с элементами?

Например, допустим, пользователям некоторой роли предоставляется доступ к записям продавцов в системе.

Но затем бизнес-аналитик говорит: «Послушайте, в этой форме есть раскрывающийся список со списком продавцов, и мы не должны позволять некоторым конкретным ролям видеть его».

Разработчик спрашивает: «Итак, мы просто удалили разрешение« Чтение продавцов »из этой роли, верно?» Но аналитик отвечает: «Нет! Эта роль по-прежнему должна иметь возможность просматривать продавцов на странице« Продавцы ». Это просто единственная форма, в которой мы должны скрыть список для некоторых ролей и показать его другим».

Итак, разработчик добавляет разрешение под названием «Показать продавцов в раскрывающемся списке на форме X».

Ой, теперь у нас проблема. Доступ к одним и тем же данным контролируется двумя отдельными разрешениями. Теперь нам нужно выяснить, как их объединить. А что, если существует более одной формы, в которой список продавцов должен быть скрыт для некоторых ролей? Как совместить это с «Прочитать список продавца»? Для нас, разработчиков, довольно ясно, что разрешение «Чтение» должно иметь более высокий приоритет над «Просмотр», поэтому даже если пользователь может «Просмотреть» список, он все равно не должен его видеть (или видеть пустое или отключенное с помощью полезного подсказка), если у него нет разрешения на «Чтение». Мы, разработчики и аналитики системы, знаем это. Но откуда это знать системному администратору? Должны ли мы научить его этому? Как мы можем гарантировать, что администратор не перепутает все эти «Просмотр» и «Чтение» для единого списка данных?

Как видите, все становится запутанным по одной причине - мы смешиваем разрешения на обработку данных с удобствами пользовательского интерфейса в списке разрешений ролей.

Я видел много проектов, где это становится беспорядочным, потому что разрешения на стороне сервера слишком сильно связаны с пользовательским интерфейсом, который требует проблем и возможных дыр в безопасности (потому что у вас есть несколько элементов в редакторе разрешений ролей для одних и тех же действий с одними и теми же данными) .

Разрешения касаются доступа и операций с некоторыми конкретными данными. Пользовательский интерфейс может только согласованно реагировать на разрешения во всей системе (отключение с помощью подсказок, скрытие и т. д.). Мы никогда не должны изобретать новые записи разрешений только для целей пользовательского интерфейса.

Остается вопрос - но как на самом деле скрыть элементы пользовательского интерфейса для некоторых пользователей системы, чтобы не перегружать их огромным количеством всегда отключенных элементов? Одним из решений могут быть ролевые рабочие области. Если мы четко знаем, что пользователям какой-либо роли никогда не понадобится доступ к каким-то конкретным данным, мы создаем набор записей управления пользовательским интерфейсом, аналогичных разрешениям, но на этот раз мы не называем их разрешениями. И здесь мы можем по-настоящему фантазировать, даже позволяя пользователям самостоятельно настраивать свое рабочее пространство и выбирать, что они могут или не могут видеть. Конечно, разрешения всегда будут иметь наивысший приоритет, но они будут влиять только на данные и состояние элементов пользовательского интерфейса, а не на видимость.

Это мои два цента. К сожалению, я сам не работал над такой системой, в которой разрешения и параметры рабочего пространства пользовательского интерфейса четко разделены, потому что я всегда почему-то прихожу к проекту слишком поздно, когда «ущерб уже нанесен». Но я надеюсь, что когда-нибудь у меня будет шанс. Я просто надеюсь найти хороший пример, как это сделать правильно, но почему-то поиск в Интернете не дает мне ничего полезного. Означает ли это, что никто другой не пришел к таким же выводам, как я? Я не верю, что кто-то в мире шаблонов корпоративного проектирования должен был давно заметить это несоответствие импеданса разрешений UI <->.

Похоже, вы объединяете роль, разрешение и авторизацию. Роль - это классификация пользователя. Разрешение - это возможность что-то делать. Авторизация - это применение разрешения к роли для действия. В вашем примере я бы не стал создавать новое разрешение для роли, я бы просто применил другое разрешение для этой роли к новому действию, т. Е. Вам разрешено читать список продавцов в форме Y, но не в форме X . Это, вероятно, потребует добавления другого действия для получения списка продавцов для формы X, чтобы вы могли применить отдельную авторизацию.

tvanfosson 22.08.2017 18:01

@tvanfosson - «вам разрешено читать список продавцов в форме Y, но не в форме X» - к сожалению, во многих случаях дело не в авторизации; это просто для удобства пользователя; просто чтобы не загромождать свое рабочее пространство ненужными элементами пользовательского интерфейса. Пользователь даже может свободно добавлять элементы обратно, если по какой-то причине они необходимы, создавая таким образом индивидуальное рабочее пространство. Но поскольку многие системы не имеют концепции таких рабочих пространств, они, как вы говорите, просто смешивают все это в огромном списке «разрешений» для применения авторизации.

JustAMartin 22.08.2017 22:57

Другие вопросы по теме