2015-09-20 22 views
12

Nel mio servizio resto posso ottenere le informazioni principali dopo l'autenticazione utilizzandoKeycloak recuperare attributi personalizzati per KeycloakPrincipal

KeycloakPrincipal kcPrincipal = (KeycloakPrincipal) servletRequest.getUserPrincipal(); 

dichiarazione.

Il principal del Keycloak non contiene tutte le informazioni necessarie per l'utente autenticato. È possibile personalizzare il mio tipo principale? Sul keycloak-server-end ho sviluppato un provider di federazione utenti. Ho visto che UserModel rende possibile aggiungere un set di attributi personalizzati al mio utente.

È possibile inserire il mio principal personalizzato in quel codice?

È possibile recuperare questi attributi dal principal del tasto chiave?

Qual è il modo? attribuisce

+0

http://stackoverflow.com/questions/29014894/obtaining-user-roles-in-servlet-application-using-keycloak –

risposta

28

Per aggiungere personalizzato è necessario fare tre cose:

  1. Aggiungere attributi per console di amministrazione
  2. Aggiungi mapping di attestazioni
  3. Accesso sostiene

Il primo è spiegato abbastanza bene qui: http://www.keycloak.org/docs/3.3/server_admin/topics/users/attributes.html

Aggiungi reclamo mapping:

  1. Aprire la console di amministrazione del proprio dominio.
  2. Andare su Clienti e aprire il client di
  3. questo funziona solo per Impostazioni> Tipo di accesso riservate o pubbliche (non portatore di sola)
  4. Vai mapper
  5. Creare una mappatura dal attributo per JSON
  6. Vedi "aggiungi al ID del token"

richieste di accesso:

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(...); 
} 

Spero che questo aiuti e si adatti al tuo caso d'uso. L'ho usato per un attributo personalizzato che ho aggiunto con un tema personalizzato.

+0

posso in grado di recuperare e-mail id, GivenName, Family Name. Impossibile recuperare l'attributo personalizzato mobile. Sto ottenendo OtherClaims con dimensione 0. –

+0

Il mio codice è: KeycloakAuthenticationToken token = (KeycloakAuthenticationToken) request. getUserPrincipal(); KeycloakPrincipal principal = (KeycloakPrincipal) token.getPrincipal(); IDToken idToken = principal.getKeycloakSecurityContext(). GetIdToken(); System.err.println ("size" + otherClaims.size() + idToken.getEmail() + idToken.getFamilyName()); –

+0

@SuryaMovva, hai aggiunto i mapping nella console di amministrazione keycloak sotto il client che stai utilizzando? –

3
  • Selezionare Utenti> Ricerca> fare clic su ID> vai alla scheda attributi> Aggiungi attributo> ad es.: Telefono> Salva enter image description here

  • Seleziona client> cliccare sul Client ID> vai alla Mappers Tab> creare mapper

    enter image description here

    enter image description here

    enter image description here

  • Get attributi personalizzati

    enter image description here

    enter image description here

+0

Grazie @Neeraj Stavo facendo le stesse cose che hai appena postato. Il problema dalla mia parte era il cache. Dopo aver aggiunto la mappatura o l'attributo utente, devo pulire la cache del realm nella console di amministrazione Keycloak. Successivamente sono stato in grado di vedere gli attributi anche in otherClaims. Spero che questo aiuti eerybody. – troger19

+0

@ troger19 Grazie per questo commento, ho passato ore e ore perché non ci pensavo. – Neikius

+0

Grazie per la soluzione. C'è un modo per applicare gli attributi personalizzati a tutti gli utenti? Ho specificamente bisogno di farlo per tutti i miei utenti che vengono importati tramite il mio provider Ldap. – user1026498

Problemi correlati