Finally it has worked. I have created an adhoc identity with roles and added the identity to private credentials.
import java.security.Principal;
import javax.security.auth.Subject;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.ws.security.wss4j.PolicyBasedWSS4JInInterceptor;
import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;
import org.jboss.logging.Logger;
import org.jboss.wsf.spi.deployment.Endpoint;
import org.jboss.wsf.spi.security.SecurityDomainContext;
import org.wildfly.security.auth.server.SecurityIdentity;
import org.wildfly.security.auth.server.SecurityDomain;
/**
*
* @author chege
*/
public class PropagateSecurityInterceptor extends WSS4JInInterceptor {
private static final Logger logger = Logger.getLogger(PropagateSecurityInterceptor.class);
public PropagateSecurityInterceptor() {
super();
getAfter().add(PolicyBasedWSS4JInInterceptor.class.getName());
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
final Endpoint endpoint = message.getExchange().get(Endpoint.class);
final SecurityDomainContext securityDomainContext = endpoint.getSecurityDomainContext();
final SecurityDomain securityDomain = securityDomainContext.getElytronSecurityDomain();
//TODO: Extract details from soap message / saml token
Principal p = new MyPrincipal("chege");
SecurityIdentity identity = securityDomain.createAdHocIdentity(p)
.withRoleMapper("ejb", r -> r.or(org.wildfly.security.authz.Roles.of("Admin")));
Subject mySubject = new Subject();
//identity must be part of private credentials
mySubject.getPrivateCredentials().add(identity);
securityDomainContext.pushSubjectContext(mySubject, p, null);
}
}
If no identity is added a new one is created by org.jboss.as.webservices.util.SubjectUtil without roles.
I can invoke ejbs annotated with @RolesAllowed
@Stateless
@RolesAllowed({"Admin"})
public class NewSessionBean {
}
Chege