我正在尝试开发一个自定义JAAS登录模块,该模块使用令牌并从不同来源获取用户数据。 它应该作为wildfly 8.2.1 final的身份验证领域。我有一个测试servlet,我想在其中进行身份验证,以便检查注入EJB的允许角色。
来自这个网站的测试:http://www.radcortez.com/custom-principal-and-loginmodule-for-wildfly/实际上我甚至开始使用他的git项目。
因为我只使用令牌,所以我无法使用request.login(username, password)
来启动wildfly登录过程。所以我尝试了这个:
@Inject
private SampleEJB sampleEJB;
...
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String token = request.getParameter("token");
try{
context = new LoginContext("TokenLoginDomain", new TokenCallbackHandler(token));
context.login();
}catch(Exception e){
e.printStackTrace();
}
response.getWriter().println("username=" + exampleEJB.getPrincipalName());
}
我的EJB看起来像这样:
@Stateless
public class SampleEJB {
@Resource
private EJBContext ejbContext;
@RolesAllowed("partner")
public String getPrincipalName() {
return ejbContext.getCallerPrincipal().getName();
}
}
如何在没有servlet凭据的情况下启动登录过程,以便用户以wildfly用户身份登录?
答案 0 :(得分:3)
您无法在Java EE中以这种方式进行身份验证。使用给定的代码,您只能在LoginContext
实例中进行身份验证。
正如您已经发现request.login(username, password)
触发了身份验证过程,但它仅限于用户名/密码凭据。
在这种情况下,您不仅应编写自定义LoginModule(标识存储),还应编写自定义身份验证机制。在身份验证过程中,身份验证机制是控制器,而身份存储是模型。
可以通过JASPIC SPI添加自定义身份验证机制,WildFly支持这种机制。
您可以从应用中注册ServerAuthModule
(SAM),其中包含一些您可以从此处复制的实用程序代码:https://github.com/arjantijms/glassfish-sam-ee-namespaces/tree/master/src/main/java/javax/security/authenticationmechanism
然后用如下所示的代码实际注册SAM: