开源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的原始/本机依赖项,那么我会回答不,您将有这个项目要编译的依赖项。