Jboss 身份验证问题

Issue With Jboss Authentication

我必须执行一些应该在会话通过身份验证后完成的操作。现在我正在使用过滤器,在过滤器内部我正在检查会话是否包含用户主体,如果是,我正在执行操作。但问题是身份验证后的每个操作都会调用它,这会导致一些问题。有什么方法可以让它只执行一次吗?

希望您的过滤器在 URL 中被调用,因为过滤器应用类似于

<filter-mapping>
   <filter-name>AuthenticationFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

如果是这样,您可以按特定 URL 或其中的一部分进行过滤。

例如:

<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/login.go</url-pattern>
</filter-mapping>

这样,您的所有其他请求都不会被过滤。希望对您有所帮助:)

Right now I am using a filter and inside the filter

只有当 HttpContext.User.Identity.IsAuthenticated 为 "true" 时,您才能进入内部过滤器,如果会话包含用户主体并且您明确设置 HttpContext.User.Identity.IsAuthenticated,则只有在您签入内部过滤器之后为真。

您可以使用 custom login module. Look at LoginModule developers guide 了解详细信息。

将您的操作放入登录模块的 commit() 方法中。将新的登录模块添加到应用程序使用的安全域中使用的登录模块链中。

已更新

示例登录模块(可以是您 WAR 部署的一部分):

package org.jboss.test;

import java.util.Map;

import javax.security.auth.Subject;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;

public class EmptyLoginModule implements LoginModule {

  public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState,
      Map<String, ?> options) {
  }

  public boolean login() throws LoginException {
    return true;
  }

  public boolean commit() throws LoginException {
    System.out.println("Authenticated");
    return true;
  }

  public boolean abort() throws LoginException {
    return true;
  }

  public boolean logout() throws LoginException {
    return true;
  }

}

示例安全域配置:

<security-domain name="web-tests" cache-type="default">
    <authentication>
        <login-module code="UsersRoles" flag="required"/>
        <login-module code="org.jboss.test.EmptyLoginModule" flag="required"/>
    </authentication>
</security-domain>