Java JAAS注销不适用于自定义登录模块

Java JAAS注销不适用于自定义登录模块,java,jakarta-ee,jaas,wildfly-9,undertow,Java,Jakarta Ee,Jaas,Wildfly 9,Undertow,在运行在WildFly 9服务器上的Java EE应用程序中,我有一个自定义登录模块: public class MyLoginModule extends AbstractServerLoginModule { private Principal identity; @Override public boolean login() throws LoginException { // do something identity = n

在运行在WildFly 9服务器上的Java EE应用程序中,我有一个自定义登录模块:

public class MyLoginModule extends AbstractServerLoginModule {

    private Principal identity;

    @Override
    public boolean login() throws LoginException {
        // do something
        identity = new SimplePrincipal("test");
        subject.getPrincipals().add(identity);
        // do something else
        return true;
    }

    @Override
    public boolean logout() throws LoginException {
        subject.getPrincipals().remove(identity);
        return true;
    }
}
login
方法按预期工作。但这与
注销
方法不同。当我编写类似于
request.getSession(false).invalidate()的东西时
Servlet
或web服务,无法访问
注销方法

这里是我的配置文件:

web.xml


客户区
有限资源
/*
*
*
我的授权
jboss-web.xml


java:/jaas/MySecurityDomain
standalone.xml


ServletExtension
class:

public class MyServletExtension implements ServletExtension {

    @Override
    public void handleDeployment(final DeploymentInfo deploymentInfo, ServletContext servletContext) {

        deploymentInfo.addAuthenticationMechanism("MY-AUTH", new AuthenticationMechanismFactory() {
            @Override
            public AuthenticationMechanism create(String mechanismName, FormParserFactory formParserFactory, Map<String, String> properties) {
                return new MyAuthenticationMechanism();
            }
        });
    }
}
public class MyAuthenticationMechanism implements AuthenticationMechanism {

    @Override
    public AuthenticationMechanismOutcome authenticate(HttpServerExchange exchange, SecurityContext securityContext) {

        PasswordCredential credential = new PasswordCredential(new char[] {});
        Account account = identityManager.verify("test", credential);
        if (account != null) {
            return AUTHENTICATED;
        } else {
            return NOT_AUTHENTICATED;
        }
    }
}

我错过了什么吗?

允许访问
MyLoginModule.logout()
的方法是
request.logout()
。我应该自己找到的

允许访问
MyLoginModule.logout()
的方法是
request.logout()
。我应该自己找到的

@Loc你是说
request.getSession(false).invalidate()
不是调用
logout
方法的方法吗?在这种情况下,有些事情我还不明白。也许你可以启发我。可能与问题没有直接关系+我可能错了(我很长时间没有使用JAAS),但在登录模块中保持会话特定状态,即
主体标识
,是否正确?@Loc这里有一个示例,其中有人说
请求.getSession(false).invalidate()
注销方法的触发器:。这不是我找到的唯一一个例子@NikosParaskevopoulos问得好。我想是的,但也许我错了。我稍后再查。@cheb1k4:对不起,我错了。我只是检查一下Tomcat的源代码。将调用logou。当您调用
request.logout()
时会发生什么情况?请注意,HttpSession.invalidate()和安全机制之间没有规范强制的关系。@你是说
请求.getSession(false).invalidate()
不是调用
注销方法的方法吗?在这种情况下,有些事情我还不明白。也许你可以启发我。可能与问题没有直接关系+我可能错了(我很长时间没有使用JAAS),但在登录模块中保持会话特定状态,即
主体标识
,是否正确?@Loc这里有一个示例,其中有人说
请求.getSession(false).invalidate()
注销方法的触发器:。这不是我找到的唯一一个例子@NikosParaskevopoulos问得好。我想是的,但也许我错了。我稍后再查。@cheb1k4:对不起,我错了。我只是检查一下Tomcat的源代码。将调用logou。当您调用
request.logout()
时会发生什么情况?请注意,HttpSession.invalidate()和安全机制之间没有规范强制的关系。