/* * Copyright 2016 Red Hat, Inc. and/or its affiliates * and other contributors as indicated by the @author tags. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.keycloak.adapters.saml.elytron; import java.security.Principal; import java.util.HashMap; import java.util.List; import java.util.Map; import org.keycloak.adapters.saml.SamlPrincipal; import org.wildfly.security.auth.SupportLevel; import org.wildfly.security.auth.server.RealmIdentity; import org.wildfly.security.auth.server.RealmUnavailableException; import org.wildfly.security.auth.server.SecurityRealm; import org.wildfly.security.authz.AuthorizationIdentity; import org.wildfly.security.authz.MapAttributes; import org.wildfly.security.credential.Credential; import org.wildfly.security.evidence.BearerTokenEvidence; import org.wildfly.security.evidence.Evidence; /** * @author <a href="mailto:psilva@redhat.com">Pedro Igor</a> */ public class KeycloakSecurityRealm implements SecurityRealm { @Override public RealmIdentity getRealmIdentity(Principal principal) throws RealmUnavailableException { if (principal instanceof SamlPrincipal) { return createRealmIdentity((SamlPrincipal) principal); } return RealmIdentity.NON_EXISTENT; } private RealmIdentity createRealmIdentity(SamlPrincipal principal) { return new RealmIdentity() { @Override public Principal getRealmIdentityPrincipal() { return principal; } @Override public SupportLevel getCredentialAcquireSupport(Class<? extends Credential> credentialType, String algorithmName) throws RealmUnavailableException { return SupportLevel.UNSUPPORTED; } @Override public <C extends Credential> C getCredential(Class<C> credentialType) throws RealmUnavailableException { return null; } @Override public SupportLevel getEvidenceVerifySupport(Class<? extends Evidence> evidenceType, String algorithmName) throws RealmUnavailableException { if (isBearerTokenEvidence(evidenceType)) { return SupportLevel.SUPPORTED; } return SupportLevel.UNSUPPORTED; } @Override public boolean verifyEvidence(Evidence evidence) throws RealmUnavailableException { return principal != null; } @Override public boolean exists() throws RealmUnavailableException { return principal != null; } @Override public AuthorizationIdentity getAuthorizationIdentity() throws RealmUnavailableException { Map<String, List<String>> attributes = new HashMap<>(principal.getAttributes()); return AuthorizationIdentity.basicIdentity(new MapAttributes(attributes)); } }; } @Override public SupportLevel getCredentialAcquireSupport(Class<? extends Credential> credentialType, String algorithmName) throws RealmUnavailableException { return SupportLevel.UNSUPPORTED; } @Override public SupportLevel getEvidenceVerifySupport(Class<? extends Evidence> evidenceType, String algorithmName) throws RealmUnavailableException { if (isBearerTokenEvidence(evidenceType)) { return SupportLevel.POSSIBLY_SUPPORTED; } return SupportLevel.UNSUPPORTED; } private boolean isBearerTokenEvidence(Class<?> evidenceType) { return evidenceType != null && evidenceType.equals(BearerTokenEvidence.class); } }