Сохранять значение в сеансе Keycloak [duplicate]

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

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

С помощью UINavigators и segues есть простые способы передачи информации контроллеру подчиненного и возврату информации. ARC делает простые указатели на вещи, полученные из NSObjects, поэтому, если вы хотите, чтобы подчиненный контроллер добавлял / изменял / модифицировал некоторые данные для вас, передайте ему указатель на изменяемый экземпляр. Блоки упрощают прохождение, поэтому, если вы хотите, чтобы подчиненный контроллер вызывал действие на вашем контроллере более высокого уровня, передайте ему блок. Вы определяете блок, чтобы принять любое количество аргументов, которое имеет смысл для вас. Вы также можете разработать API для использования нескольких блоков, если это лучше всего подходит.

Вот два тривиальных примера клея segue. Первый - это простой показ одного параметра, переданного для ввода, второй для вывода.

// Prepare the destination view controller by passing it the input we want it to work on
// and the results we will look at when the user has navigated back to this controller's view.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    [[segue destinationViewController]

     // This parameter gives the next controller the data it works on.
     segueHandoffWithInput:self.dataForNextController

     // This parameter allows the next controller to pass back results
     // by virtue of both controllers having a pointer to the same object.
     andResults:self.resultsFromNextController];
}

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

// Prepare the destination view controller by passing it the input we want it to work on
// and the callback when it has done its work.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    [[segue destinationViewController]

     // This parameter gives the next controller the data it works on.
     segueHandoffWithInput:self.dataForNextController

     // This parameter allows the next controller to pass back results.
     resultsBlock:^(id results) {
         // This callback could be as involved as you like.
         // It can use Grand Central Dispatch to have work done on another thread for example.
        [self setResultsFromNextController:results];
    }];
}
18
задан Alex 20 September 2015 в 11:30
поделиться

2 ответа

Чтобы добавить пользовательские атрибуты, вам нужно сделать три вещи:

  1. Добавить атрибуты в консоль администратора
  2. Добавить отображение претензий
  3. Требования к доступу
  4. g3]

Первый объясняется здесь довольно хорошо: http://www.keycloak.org/docs/3.3/server_admin/topics/users/attributes.html

Добавить сопоставление претензий:

  1. Открыть консоль администратора вашей области.
  2. Перейти к Клиентам и открыть своего клиента
  3. Это только работает для настроек> Тип доступа конфиденциальный или общедоступный (не только для канала)
  4. Перейти к Mappers
  5. Создать сопоставление вашего атрибута с json
  6. Проверить «Добавить to ID token "

Требования к доступу:

final Principal userPrincipal = httpRequest.getUserPrincipal();

if (userPrincipal instanceof KeycloakPrincipal) {

    KeycloakPrincipal<KeycloakSecurityContext> kp = (KeycloakPrincipal<KeycloakSecurityContext>) userPrincipal;
    IDToken token = kp.getKeycloakSecurityContext().getIdToken();

    Map<String, Object> otherClaims = token.getOtherClaims();

    if (otherClaims.containsKey("YOUR_CLAIM_KEY")) {
        yourClaim = String.valueOf(otherClaims.get("YOUR_CLAIM_KEY"));
    }
} else {
    throw new RuntimeException(...);
}

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

39
ответ дан aweibell 23 August 2018 в 22:11
поделиться
  • Выберите «Пользователи»> «Поиск»> нажмите «Идентификатор»> перейдите на вкладку «Свойства»> «Добавить атрибут»> например: телефон> Сохранить enter image description here [/g0]
  • Выберите Клиенты> щелкните по идентификатору клиента> перейдите к вкладке Mappers> create mapper enter image description here [/g1] enter image description here [/g2] enter image description here [/g3]
  • Получить пользовательские атрибуты enter image description here [/g4] enter image description here [/g5]
11
ответ дан Mogsdad 23 August 2018 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: