23 Replies Latest reply: Aug 7, 2014 7:23 AM by Igor Stepanov RSS

    Как разграничить доступ пользователя к данным?

    Igor Stepanov

      Привет, коллеги!

       

      Можно ли в QV разграничить доступ пользователей к данным подобным образом:

       

      Например: есть данные о продажах товаров с показателями выручка и себестоимость.

      Задача состоит в том что бы для определенных товаров пользователь мог видеть все показатели (выручка, себестоимость), а по всем остальным товарам ему была бы доступна только выручка.

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

       

      Есть какие-либо решения или идеи?

       

      Спасибо.

        • Re: Как разграничить доступ пользователя к данным?
          Ivan Konkov

          Много ли таких пользователей с группами товаров?  Имеется ли  Publisher  в поставке?  Вообще два варианта решения этой задачи:

           

          1. Publisher( если имеется)

          2.   Section Access

           

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

            • Re: Как разграничить доступ пользователя к данным?
              Sergey Polekhin

              1. Согласен, что выбранный подход будет зависеть от объема данных, количества пользователей и имеющихся компонентов в составе решения: Section Access, Publisher или обоих вместе.

              2. Полагаю, что помимо вопроса "нарезки данных" средствами Section Access или Publisher, в приложении нужно учитывать некоторую специфику задачи:

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

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

              в) При использовании Section Access, потребуется загружать данные по себестоимостям в отдельную, несвязанную с другими данными таблицу в рамках одного приложения и применять секционирование доступа именно к этой таблице. А для отображения доступных для пользователя данных потребуется описание набора в виде функции Set-Analysis, отбирающей данные для визуализации в объекты QlikView (таблицы, диаграммы, текстовые объекты и т.п.) на основе какого-то выбранного критерия, например, идентификатора товарной группы.

               

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

                • Re: Как разграничить доступ пользователя к данным?

                  А если  через переменные? В таблицу с товарами и пользователями добавить доп. флаг для каждого показателя. А далее

                  set vCost = if(costFlag=1,себестоимость, 0), а в формулах использовать как  sum(vCost).

                    • Re: Как разграничить доступ пользователя к данным?
                      Sergey Polekhin

                      Вопрос лишь в том, на каком уровне требуется обеспечить безопасность.

                      Если мы говорим о разграничении доступа только на уровне визуализации, то предложенный вариант с формулами подойдет. Если же мы говорим о реальной безопасности, когда пользователь не просто не видит в данный момент данных, а принципиально не может их увидеть, то их необходимо ограничивать средствами Publisher, Section Access или обоими инструментами сразу.

                    • Re: Как разграничить доступ пользователя к данным?
                      Igor Stepanov

                      Сергей, продемонстрируйте пожалуйста предложенное вами решение на примере. Я не понимаю как не связанная ни с чем таблица с себестоимостью должна работать. Реагировать на все сделанные селекты, отображаться в диаграмме, а как например посчитать маржу (выручка-с/с)?

                       

                      Например, есть такие данные (искусственные, но соответствующие нашей структуре данных). И например пользователю U1 нужно ввести ограничения на просмотр с/с по всем типам продукта кроме A. (Файл с данными также прикрепил)

                       

                       

                      QTYСost_RURСost_USDShipment DateRevenue_RURRevenue_USDSalesIdТип продуктаТовар Код
                      95218572.8333301.02.2013295798.566671At1
                      333102103.402.02.20135860195.33332Bt2
                      397802603.02.2013118639.533332Ct3
                      2114704904.02.2013149349.766672Dt4
                      5834811.605.02.201364521.53At5
                      1976025.3333306.02.2013143747.94Bt6
                      6237212.407.02.201372224.066675Dt7
                      1953.16666708.02.20131735.7666675Et8
                      855355178.509.02.20137101236.76Dt9
                      61685.610.02.201330910.37At10
                      55170556.8333311.02.2013183261.066678Bt11
                      4642.13333312.02.2013662.29Ct12
                      522086.93333313.02.201337012.3333310Dt13
                      1891830.614.02.2013149649.8666711At14
                      19104534.8333315.02.2013208569.512Bt15
                      3174424.816.02.2013101133.713Dt16
                      21364.53333317.02.20131846.13333314Et17
                      83141147.0333318.02.2013209969.9666715Dt18
                      33224474.819.02.2013261187.0333316At19
                      9181927.320.02.2013156852.2666717Bt20
                      83224174.721.02.20134236141.218Ct21
                      21565.222.02.20131795.96666719Dt22
                      784212140.423.02.20136581219.366720At23
                      61256285.424.02.2013265888.621Bt24
                      997821260.725.02.20139666322.222Dt25
                      875225.0666726.02.20139303123Et26
                      646336211.227.02.20137713257.124Dt27

                       

                       

                      заранее благодарен за ответ.

                        • Re: Как разграничить доступ пользователя к данным?
                          Eugeny Ilyin

                          Добрый день.

                          ну вот например, такая идея:

                           

                          Section Access;

                          LOAD * INLINE [

                              ACCESS, USERID

                              ADMIN, A1

                              USER, U1

                              USER, U2

                          ];

                          Section Application;

                           

                          let vCUser = QVUser();

                          List_ACL:

                          LOAD * INLINE [

                              CurUser, AccProd

                              A1, "'*'"

                              U1, "'B','C','D','E'"

                              U2, "'D','E'"

                          ]

                          Where match(CurUser,'$(vCUser)');

                           

                           

                          let vUserAcc=peek('AccProd',0,'List_ACL');

                           

                           

                          LOAD *,

                          if(wildmatch([Тип продукта],$(vUserAcc)),Сost_RUR,0) as UserCost

                          INLINE [

                              QTY, Сost_RUR, Сost_USD, Shipment Date, Revenue_RUR, Revenue_USD, SalesId, Тип продукта, Товар Код

                              95, 2185, 72.83333, 01.02.2013, 2957, 98.56667, 1, A, t1

                              33, 3102, 103.4, 02.02.2013, 5860, 195.3333, 2, B, t2

                              39, 780, 26, 03.02.2013, 1186, 39.53333, 2, C, t3

                              21, 1470, 49, 04.02.2013, 1493, 49.76667, 2, D, t4

                              58, 348, 11.6, 05.02.2013, 645, 21.5, 3, A, t5

                              19, 760, 25.33333, 06.02.2013, 1437, 47.9, 4, B, t6

                              62, 372, 12.4, 07.02.2013, 722, 24.06667, 5, D, t7

                              1, 95, 3.166667, 08.02.2013, 173, 5.766667, 5, E, t8

                              85, 5355, 178.5, 09.02.2013, 7101, 236.7, 6, D, t9

                              6, 168, 5.6, 10.02.2013, 309, 10.3, 7, A, t10

                              55, 1705, 56.83333, 11.02.2013, 1832, 61.06667, 8, B, t11

                              4, 64, 2.133333, 12.02.2013, 66, 2.2, 9, C, t12

                              52, 208, 6.933333, 13.02.2013, 370, 12.33333, 10, D, t13

                              18, 918, 30.6, 14.02.2013, 1496, 49.86667, 11, A, t14

                              19, 1045, 34.83333, 15.02.2013, 2085, 69.5, 12, B, t15

                              31, 744, 24.8, 16.02.2013, 1011, 33.7, 13, D, t16

                              2, 136, 4.533333, 17.02.2013, 184, 6.133333, 14, E, t17

                              83, 1411, 47.03333, 18.02.2013, 2099, 69.96667, 15, D, t18

                              33, 2244, 74.8, 19.02.2013, 2611, 87.03333, 16, A, t19

                              91, 819, 27.3, 20.02.2013, 1568, 52.26667, 17, B, t20

                              83, 2241, 74.7, 21.02.2013, 4236, 141.2, 18, C, t21

                              2, 156, 5.2, 22.02.2013, 179, 5.966667, 19, D, t22

                              78, 4212, 140.4, 23.02.2013, 6581, 219.3667, 20, A, t23

                              61, 2562, 85.4, 24.02.2013, 2658, 88.6, 21, B, t24

                              99, 7821, 260.7, 25.02.2013, 9666, 322.2, 22, D, t25

                              8, 752, 25.06667, 26.02.2013, 930, 31, 23, E, t26

                              64, 6336, 211.2, 27.02.2013, 7713, 257.1, 24, D, t27

                          ];

                           

                          При каждом открытии документа следует выполнять обновление данных, тогда данные не будут загружаться согласно таблице доступа List_ACL

                          123.png

                          • Re: Как разграничить доступ пользователя к данным?
                            Sergey Polekhin

                            Игорь, доброго дня,

                            Прикрепляю простейший пример.

                             

                            В нем заданы пользователи (все без пароля):

                            • U1 - U5, для которых в секции доступа задана возможность просматривать Cost по только одной из продуктовых групп (A-E соответственно)
                            • U6, для которого в секции доступа задана возможность просматривать Cost по 4-м первым продуктовым группам (A-D)
                            • Admin, для которого в секции доступа задана возможность просматривать Cost по всем группам продуктов одновременно (A-E)

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

                             

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

                             

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

                              • Re: Как разграничить доступ пользователя к данным?
                                Sergey Polekhin

                                Игорь, добрый день,

                                помог ли предложенный вариант?

                                  • Re: Как разграничить доступ пользователя к данным?
                                    Igor Stepanov

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

                                      • Re: Как разграничить доступ пользователя к данным?
                                        Sergey Polekhin

                                        Игорь, в случае если вы ходите вводить ограничения на доступность данных на уровне скрипта, то есть до того, как пользователь получит доступ к документу, то это означает,что:

                                        1. Вам необходимо иметь таблицу соответствий пользователей и доступных им групп товаров
                                        2. Использовать Publisher, который позволит "нарезать" данные по заданной таблице соответствий. Попытки выполнения "нарезки" вручную (путем создания последовательностей команд скрипта) приведут к существенным трудозатратам на создание скрипта и последующее его сопровождение.
                              • Re: Как разграничить доступ пользователя к данным?
                                Igor Stepanov

                                Всего 10 пользователей, для которых необходимы такие ограничения. и около 800 товаров.

                                Publisher не имеется

                              • Re: Как разграничить доступ пользователя к данным?
                                Eugeny Ilyin

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

                                load * inline [
                                ACCESS, USERID,REDUCTION, OMIT
                                ADMIN, ADMIN,*,
                                USER, A,1
                                USER, B, 2,NUM
                                USER, C, 3, ALPHA
                                ];

                                section application;
                                T1:
                                load *,
                                NUM AS REDUCTION;
                                load
                                Chr(RecNo()+ord('A')-1) AS ALPHA,
                                RecNo() AS NUM
                                AUTOGENERATE 3;
                                • Re: Как разграничить доступ пользователя к данным?
                                  whiteline _

                                  Эффективное решение сильно зависит от используемой модели данных и возможности вносить в нее изменнеия.

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

                                  • Re: Как разграничить доступ пользователя к данным?
                                    Павел Карасев

                                    Игорь,

                                    мы решили проблему разделения прав доступа - посредством ограничения прав на лист.

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

                                    В итоге мы выделили неодходимые показатели для каждого отдела на отдельный лист. И дали права каждому отделу на свой лист.

                                    хотя может и не самый красивый метод, но рабочий.

                                    • Re: Как разграничить доступ пользователя к данным?
                                      Eugeny Ilyin

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

                                        • Re: Как разграничить доступ пользователя к данным?
                                          Igor Stepanov

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

                                        • Re: Как разграничить доступ пользователя к данным?
                                          Igor Stepanov

                                          На текущий момент мы решили вопрос так:

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

                                          Т.е. в одном документе 2 модели. Одна основная со всеми возможными данными, на которую накладываются ограничения в Section Access и вторая ее копия, на которую не накладываются ограничения в section access и которая содержит только те данные, доступ к которым не должен ограничиваться.

                                          В визуализации: на одном листе данные из основной модели, на втором листе данные из ее копии.

                                           

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

                                           

                                          Не удобно только, то что фильтры нужно устанавливать для каждого листа по отдельности.

                                           

                                          Как плюс еще получили соответствие итоговых показателей выручка, с/с, маржа.

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

                                           

                                          Серьезного увеличения трудозатрат на поддержку пока вроде не видно. По памяти qvw вырос на 25% (для нас не критично). Время работы скрипта увеличилось совсем не значительно.

                                          Пользователей этот вариант устроил. А это самое главное.

                                           

                                          Всем спасибо за обсуждение! Благодаря вашим идеям мы нашли решение устраивающее нас!