我正在尝试实现一个自定义安全领域,该领域可以访问数据库进行用户验证。我想从数据源模块注入一个配置好的数据库。似乎没有依赖项注入工作,因为它也未能注入ContextService。我降低的安全领域:
import java.security.Principal;
import java.security.spec.AlgorithmParameterSpec;
import java.util.Map;
import java.util.function.Consumer;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.sql.DataSource;
import org.wildfly.extension.elytron.Configurable;
import org.wildfly.security.auth.SupportLevel;
import org.wildfly.security.auth.realm.CacheableSecurityRealm;
import org.wildfly.security.auth.server.RealmIdentity;
import org.wildfly.security.auth.server.RealmUnavailableException;
import org.wildfly.security.credential.Credential;
import org.wildfly.security.evidence.Evidence;
import org.wildfly.security.evidence.PasswordGuessEvidence;
@Stateless
public class ExampleRealm implements CacheableSecurityRealm, Configurable
{
@Resource(name = "java:jboss/datasources/ExampleDS")
private DataSource ds;
public ExampleRealm()
{
// nothing
}
@PostConstruct
public void init()
{
System.out.println("init CDI DemoBean");
}
@Override
public void initialize(final Map<String, String> map)
{
System.out.println("init " + ds);
}
@Override
public void registerIdentityChangeListener(final Consumer<Principal> cnsmr)
{
// nothing
}
@Override
public SupportLevel getCredentialAcquireSupport(final Class<? extends Credential> credentialType, final String algorithmName,
final AlgorithmParameterSpec parameterSpec) throws RealmUnavailableException
{
return SupportLevel.UNSUPPORTED;
}
@Override
public SupportLevel getEvidenceVerifySupport(final Class<? extends Evidence> evidenceType, final String algorithmName) throws RealmUnavailableException
{
return PasswordGuessEvidence.class.isAssignableFrom(evidenceType) ? SupportLevel.POSSIBLY_SUPPORTED : SupportLevel.UNSUPPORTED;
}
@Override
public RealmIdentity getRealmIdentity(final Principal principal) throws RealmUnavailableException
{
System.out.println("getIdentity " + ds);
//omitted
return RealmIdentity.NON_EXISTENT;
}
}
我在module.xml中尝试了不同的依赖关系。当前的module.xml:
<?xml version='1.0' encoding='UTF-8'?>
<module xmlns="urn:jboss:module:1.1" name="prototype.webAuth.providers">
<resources>
<resource-root path="loginProviders-1.0.0.jar"/>
</resources>
<dependencies>
<module name="org.wildfly.security.elytron"/>
<module name="org.wildfly.extension.elytron"/>
<module name="javax.api"/>
<module name="javax.annotation.api"/>
<module name="javax.ejb.api"/>
<module name="javax.resource.api"/>
<module name="javax.enterprise.api"/>
<module name="javax.inject.api"/>
<module name="javax.interceptor.api"/>
<module name="javax.validation.api"/>
<module name="org.hibernate.validator"/>
<module name="javax.xml.stream.api"/>
</dependencies>
</module>
数据源在standalone.xml中可用,可以在servlet中注入和访问,servlet包含在已部署的war文件中。但在安全领域,它是空的。
jar是用maven和打包ejb创建的。有什么建议吗?
您正试图将安全领域定义为不受支持的EJB。安全领域类不是作为EJB部署的。此外,不支持其他自定义Elytron组件作为CDI bean。
如果您想定义基于CDI的组件,您可以使用标准的Jakarta EE安全API,该API允许您将身份验证机制和身份存储定义为CDI-beans。