带有Wildfly的JAAS自定义登录模块

时间:2015-11-06 13:52:40

标签: servlets ejb wildfly jaas user-roles

我正在尝试开发一个自定义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用户身份登录?

1 个答案:

答案 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:

https://github.com/arjantijms/glassfish-sam-ee-namespaces/blob/master/src/main/java/test/SamAutoRegistrationListener.java