2016-11-15 1 views
1

У нас есть приложение xpage, которое требует от пользователя входа в систему (используйте идентификатор Lotus Notes и пароль). Если пользователь успешно войдет в систему, он перенаправит пользователя на указанную страницу (например, home.xsp).Если у пользователя несколько ролей, как разрешить пользователю выбрать одну роль для доступа к приложению?

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

Username | Role 
Alan  | admin 
Ben  | user 
John  | leader 
Judy  | developver 
Sam  | manager 
Susan | senior 
Tom  | user 

В последнее время наши пользователи передумали, они хотят иметь несколько ролей в приложении. Пожалуйста, рассмотрите следующую ситуацию.

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

На указанной странице (например, home.xsp) эта страница будет отображаться после успешного входа пользователя в систему. Мы пытаемся выяснить, имеет ли пользователь несколько ролей или нет, поэтому мы помещаем следующий код в beforePageLoad Event.

var roles = context.getUser().getRoles() 
//if the user has multiple roles, force them to other page 
if(roles.length > 1) 
{ 
    context.redirectToPage("chooserole.xsp"); 
} 
else 
{ 
    //do nothing 
} 

В chooserole.xsp, страница будет найти ту роль, которую пользователь должен затем попросить пользователя выбрать один, чтобы войти в систему. Таким образом, страница будет выглядеть следующим образом

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"><xp:label value="Please select user role" id="label1" style="margin-left:200.0px"></xp:label> 
<xp:text escape="true" id="computedField2" rendered="false"> 
    <xp:this.value><![CDATA[#{javascript:context.getUser().getRoles() 
}]]></xp:this.value> 
</xp:text><xp:br></xp:br> 

<xp:radioGroup id="radioGroup1" layout="pageDirection" style="margin-left:100.0px" value="#{applicationScope.role}"> 
    <xp:selectItems> 
     <xp:this.value><![CDATA[#{javascript:getComponent("computedField2").getValue();}]]></xp:this.value> 
    </xp:selectItems> 
</xp:radioGroup> 

<xp:br></xp:br> 
<xp:button value="Login" id="button1" style="height:35.0px;margin-left:200.0px"> 
    <xp:eventHandler event="onclick" submit="true" refreshMode="complete"> 
     <xp:this.action><![CDATA[#{javascript:var rolevalue = getComponent("radioGroup1").getValue(); 
applicationScope.put(role,rolevalue); 
context.redirectToPage("Home.xsp");}]]></xp:this.action> 
    </xp:eventHandler></xp:button><xp:button value="Cancel" id="button2" style="height:35.0px;margin-left:30.0px"></xp:button><xp:br></xp:br> 

</xp:view> 

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

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

Одна вещь, которую мы не понимаем, находится в chooserole.xsp, мы просим пользователя выбрать одну роль для входа в систему, когда пользователь выбирает одну роль, эта роль должна направить пользователя на home.xsp. Тем не менее, home.xsp кажется «думаю», что у пользователя много роли, поэтому он сохраняет пользователя в chooserole.xsp.

Мы сделали что-то неправильно в кодировании? мы попытались удалить код в beforePageLoad и поместить в afterPageLoad, но программа по-прежнему сохраняет пользователя в chooserole.xsp.

Благодарен за ваш совет. Спасибо.

Ссылки:

https://lostinxpages.com/2014/01/06/finding-user-roles-in-xpages/

Access Control with a multi database application

XPages: context.getUser().getRoles() working sporadically

http://flylib.com/books/en/2.348.1.172/1/

+1

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

ответ

1

Вы тест в beforePageLoad случае home.xsp, если пользователь имеет более одной роли.

Если да, вы перенаправляетесь на chooserole.xsp. Вы разрешаете пользователю выбирать одну роль и помещать ее в переменную applicationScope. Затем вы перенаправляете обратно на home.xsp.

У пользователя есть еще более одна роль. Он перенаправляет на chooserole.xsp ... добро пожаловать в инфинитивный цикл.


Решение:

Используйте sessionScope переменная один роли пользователя (а не переменная applicationScope, как это совместно всех пользователей), например, sessionScope.role.

испытания в beforePageLoad случае home.xsp, если sessionScope.role не определено с
if (!sessionScope.containsKey("role")) { ...
Если не определено, то установите его в одной роли, которую пользователь должен или перенаправить chooserole.xsp, если пользователь имеет более одной роли.

Установить sessionScope.role в chooserole.xsp, чтобы роль пользователя выбрала и перенаправила обратно на home.xsp.

Теперь, sessionScope.role имеет значение (одна роль), и вы можете перейти к содержимому home.xsp.

Убедитесь, что вы проверить в вашем меню или везде, где вы используете роль один для sessionScope.role и не context.getUser().getRoles() больше.

+0

Да, вы правы. Фактически, мы считаем, что значение области приложения позволит программе «знать» ту роль, которую пользователь хочет войти в систему. Но в результате мы ошибаемся, программа просто продолжает цикл. Нам еще нужно выяснить, как разрешить пользователю выбирать одну роль для входа в xpages вместо того, чтобы изменять роль в списке управления доступом. – beginner

+0

@beginner вы почти находитесь: вам просто нужно проверить applicationScope.role, а затем использовать значение в applicationScope.role как роль –

+0

applicationScope будет тем же значением для _all_ пользователей приложения. Как говорит Кнут, вы должны использовать 'sessionScope'. Независимо от всего этого, и, как говорит Кнут, вы не можете переопределить настройки роли ACL Domino. Вы не сможете полагаться на тех, кто находится в вашей кодировке, в остальной части приложения. Вам придется изменить его, чтобы вместо этого использовать значение sessionScope. В это время может оказаться целесообразным отступить и перепроектировать приложение, чтобы избежать использования ролей на уровне ACL и вместо этого иметь псевдослучайную роль, назначаемую пользователям в файле конфигурации. –