自定义登录模块没有执行?

时间:2014-03-27 16:01:41

标签: java-ee jboss jaas wildfly

我尝试编写自己的自定义登录模块,简化如下:

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">部分的安全域。最后,我使用@WebService对我的@SecurityDomain(value = "my-security")课程进行了分配。如果我这样做,我会得到一个EJBAccessException,如果没有@SecurityDomain注释我就会得到System.out.println()。我会考虑这种预期的行为,因为我还没有提供凭据但是如果我将断点设置为我的登录模块类的任何方法,我可以看到它永远不会被执行。如果我添加了log4j或Delegating电话,它们也不会出现在我的控制台上。我已经在调试模式下从Eclipse部署并启动了我的Wildfly。

我错过了什么,或者只是我希望能够调试这个错误吗?

修改

在我发现Eclipse没有显示整个日志之后,我发现默认授权模块(<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> )失败了。我将安全域更改为

org.jboss.as.security.service.SimpleSecurityManager#authenticate(final String runAs, final String runAsPrincipal, final Set<String> extraRoles)

我现在希望我的请求通过授权并在此之后执行我的登录模块(尽管在授权之前验证会更有意义),但现在它只是接受所有请求。所以我觉得某个地方的概念错了,我似乎无法找到一些文件来为我清除这一点。有人可以告诉我如何正确配置吗?

修改

经过一些调试后,我发现"my-security"已被执行。在授权之前,它确实是认证。它首先获取安全上下文,并显示安全域是实际的{{1}}。但是它然后执行它自己的身份验证,它检测丢失的主体并设置具有有效身份验证的未经身份验证的身份验证(WAT?)。结果,验证成功并执行授权。我仍然没有得到我的登录模块适合该过程的位置以及如何正确配置它。这让我慢慢感到疯狂......

1 个答案:

答案 0 :(得分:1)

原来必须启用@WebContext annotationb才能启用对Web服务的身份验证:

@WebContext(contextRoot = "/myservice", urlPattern = "/*", authMethod = "BASIC", secureWSDLAccess = false)

从所有教程中我都不清楚这一点。启用HTTP身份验证而不是jaas身份验证似乎是可选的。也许还有一种没有它的方法,但它现在按预期工作。

相关问题