为什么LoginContext生成器在Java EE/Servlet容器中工作?



开源Java EE 6 Petstore项目实现了一个LoginContext生成器来执行自定义用户身份验证。下面是源代码。
为什么会这样呢?它是特定于应用服务器还是标准行为(例如,由某些JSR强制执行)?

 package org.agoncal.application.petstore.security;
import org.agoncal.application.petstore.util.ConfigProperty;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
import java.io.File;
import java.net.URISyntaxException;
/**
 * @author blep
 *         Date: 16/02/12
 *         Time: 07:28
 */
public class LoginContextProducer {
    // ======================================
    // =             Attributes             =
    // ======================================
    @Inject
    private SimpleCallbackHandler callbackHandler;
    // ======================================
    // =          Business methods          =
    // ======================================
    @Produces
    public LoginContext produceLoginContext(@ConfigProperty("loginConfigFile") String loginConfigFileName,
                                            @ConfigProperty("loginModuleName") String loginModuleName) throws LoginException, URISyntaxException {
        System.setProperty("java.security.auth.login.config", new File(LoginContextProducer.class.getResource(loginConfigFileName).toURI()).getPath());
        try {
            return new LoginContext(loginModuleName, callbackHandler);
        } catch (Exception e) {
            System.out.println("ouch!!!");
            return null;
        }
    }
}

LoginContext是Java身份验证和授权服务(JAAS)的一部分。

LoginContextProducer是一个CDI"生产者",它处理生成LoginContext的问题,以便其他类可以注入它。自定义登录模块在SimpleLoginModule中实现,它的使用在配置文件(config.properties)中指定。

如果您乐意使用应用服务器提供的JAAS的默认实现,则不需要编写自定义登录模块或生产者。

看看这个项目这里的POM Maven,如果不让任何东西泄露,这些主要技术正在这个项目中使用:

  • EJB (Enterprise JavaBeans)
  • JPA (Java Persistence API)
  • JSF (Java Server Faces)
  • Angular (Framework)和AJAX
  • Arquillian(用于积分测试)
  • Junit(用于单元测试)

在GlassFish服务器上运行

这里的j2ee规范6说您可以使用依赖项,然后代码在标准中。如果您的问题是这个项目是否可以使用J2ee的原始/本机依赖项,那么我会回答不,您将有这个项目要编译的依赖项。

最新更新