Как получить пользовательские данные при использовании KeyCloak при использовании адаптера Java Servlet Filter

Я пытаюсь использовать KeyCloak для разработки поставщика услуг и аутентификации в отношении OpenAM IDP.

Я следовал этим инструкциям: http://keycloak.github.io/docs/userguide/saml-client-adapter/html/ch07.html

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

userPrinciple имеет тип SamlPrinciple, а не KeycloakPrinciple.

оба атрибута и дружественные атрибуты пусты.

import org.keycloak.adapters.saml.SamlPrincipal;
import org.keycloak.KeycloakPrincipal;

@Path("/user")
public class User {

    @GET
    @Path("/")
    @Produces({ MediaType.APPLICATION_JSON })
    @Consumes({ MediaType.APPLICATION_JSON })
    public Object info(@Context SecurityContext context) {

        SamlPrincipal userPrincipal = (SamlPrincipal) context
                .getUserPrincipal();

        Set<String> attributeNames = userPrincipal.getAttributeNames();
        Set<String> friendlyNames = userPrincipal.getFriendlyNames();
        ...
    }

Оба атрибутаNames и friendlyNames являются пустыми наборами (размер = 0).

Когда я смотрю на связь между KeyCloak SP и OpenAP IDP, я вижу запрос-ответ, который отправляет пользовательские данные:

OpenAM --› Информация о пользователе KeyCloak

Как и где я могу получить эту информацию о пользователе из объекта SamlPrinciple?


person mvermand    schedule 01.06.2016    source источник


Ответы (2)


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

SamlPrincipal samlPrincipal = (SamlPrincipal) principal;
userName = samlPrincipal.getFriendlyAttribute("username");
Principal principal = httpReq.getUserPrincipal();
person Sudharasan D    schedule 30.05.2017

Я сделал то же самое, как показано ниже, я реализовал свой пользовательский объект сведений о пользователе и заполнил значения из ответа SAML, сопоставил каждое пользовательское поле с атрибутами пользовательского объекта и установил то же самое в Principal of SpringContext.

  1. создайте свой собственный объект сведений о пользователе, используя класс «mrpSAMLUserDetails».

E.g.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;

import org.apache.log4j.Logger;
import org.opensaml.saml2.core.Attribute;
import org.opensaml.xml.XMLObject;
import org.opensaml.xml.schema.XSString;
import org.opensaml.xml.schema.impl.XSAnyImpl;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.hierarchicalroles.UserDetailsServiceWrapper;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.saml.SAMLCredential;
import org.springframework.security.saml.userdetails.SAMLUserDetailsService;

public class mrpSAMLUserDetails implements SAMLUserDetailsService {

    private static Logger logger = Logger.getLogger(mrpSAMLUserDetails.class);



    @Override
    public Object loadUserBySAML(SAMLCredential mrpSAMLCredential)
            throws UsernameNotFoundException {



        logger.info("mrp custom loaduserBySAML Entered");
        boolean enabled=true,accountNONExpired=true,credentialNONExpired=true,accountNONLocked=true;
        String username = "",password="",role="",fetchRole="Role",sourceOfLogin="";
        //String[] roleArray = null;
        List<String> samlRoles = new ArrayList<String>();

        GrantedAuthority authority = new SimpleGrantedAuthority("mrpnoneROLE");
        List<GrantedAuthority> authoritiesList = new ArrayList<GrantedAuthority>();
        username = mrpSAMLCredential.getNameID().getValue();
        username = username.toLowerCase();
        role= mrpSAMLCredential.getAttributeAsString("Role").toString();
        //String[] roleArray = mrpSAMLCredential.getAttributeAsStringArray(samlRoleName);       
                            authority = new SimpleGrantedAuthority(tempRole);

        authoritiesList.add(authority);

        UserDetails mrpuser=new User(username,password,enabled,accountNONExpired,credentialNONExpired,accountNONLocked,authoritiesList);

        logger.info("mrp custom loaduserBySAML DONE!!!");


        return mrpuser;
    }



}
  1. настройте «mrpSAMLUserDetails» в вашем файле spring-security.xml, например..

            <property name="userDetails" ref="mrpcustomuser" />
        <property name="forcePrincipalAsString" value="false"/>
    
        </bean>
        <bean id="mrpcustomuser" class="com.mrp.sso.security.mrpSAMLUserDetails" />
    

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

person meetarun    schedule 01.06.2016
comment
Спасибо за ваш ответ, но мы не используем Spring... Просто jax-rs (RestEasy) на JBoss Wildfly и org.keycloak.adapters.saml.servlet.SamlFilter. - person mvermand; 01.06.2016