我试着写一个简化这个样子的我自己的自定义登录模块:自定义登录模块未执行?
package my.package;
public class MyUsernamePasswordLoginModule extends UsernamePasswordLoginModule {
@Override
protected Group[] getRoleSets() throws LoginException {
return new Group[] { };
}
@Override
protected boolean validatePassword(String inputPassword, String expectedPassword) {
return true;
}
@Override
protected String getUsersPassword() throws LoginException {
return "";
}
}
我认为在实际执行不是我的问题很重要。该类包含在我部署的EJB中。接下来,我在Wildflys standalone.xml
中设置了该模块。我刚添加了
<security-domain name="my-security" cache-type="default">
<authentication>
<login-module code="my.package.MyUsernamePasswordLoginModule" flag="required" />
</authentication>
</security-domain>
到<subsystem xmlns="urn:jboss:domain:security:1.2">
部分的安全域。最后,我用@SecurityDomain(value = "my-security")
对我的@WebService
班进行了说明。如果我这样做,我会得到一个EJBAccessException
,如果没有@SecurityDomain
注释,我将得不到这个EJBAccessException
。我会考虑这种预期的行为,因为我还没有提供凭证,但是如果我为我的登录模块类的任何方法设置了断点,我可以看到它永远不会被执行。如果我添加log4j或System.out.println()
调用,它们也不会出现在我的控制台上。我以调试模式部署并从Eclipse启动了Wildfly。
我错过了什么或只是我的期望能够调试这个错误?
编辑
后,我发现了Eclipse并没有显示整个日志,我发现默认的授权模块(这是Delegating
)失败。我改变了我的安全域
<security-domain name="my-security" cache-type="default">
<authentication>
<login-module code="my.package.MyUsernamePasswordLoginModule" flag="required" />
</authentication>
<authorization>
<policy-module code="PermitAll" flag="required"/>
</authorization>
</security-domain>
现在我想到的是我的请求,授权通过后执行我的登录模块(虽然认证将使授权之前更有意义),但现在它只是accpets所有请求。所以看来我的某个地方有错误的概念,我似乎无法找到一些文件来为我解决这个问题。有人可以告诉我如何正确配置?
编辑
一些调试后我发现org.jboss.as.security.service.SimpleSecurityManager#authenticate(final String runAs, final String runAsPrincipal, final Set<String> extraRoles)
执行。在授权之前,它确实有意义。它首先获取安全上下文,并且它显示安全域实际上是"my-security"
。但是,它执行它自己的验证,它检测到一个缺失的委托人,并设置具有有效验证(WAT?)的未经身份验证的身份验证。结果验证成功并且授权被执行。我仍然没有得到我的登录模块适合该进程以及如何正确配置它的地方。这慢慢地驱使我疯了现在......