我必须执行一些应该在 session 经过身份验证后完成的操作。现在我正在使用过滤器,在过滤器内我正在检查 session 是否包含用户主体,如果是,我正在执行该操作。但问题是,身份验证后的每个操作都会被调用,这会导致一些问题。有什么方法可以只执行一次吗?
最佳答案
您可以使用 custom login module 。看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>
关于java - Jboss 身份验证问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32207337/