Servlets 使用Wildfly的JAAS自定义登录模块

Servlets 使用Wildfly的JAAS自定义登录模块,servlets,ejb,wildfly,jaas,user-roles,Servlets,Ejb,Wildfly,Jaas,User Roles,我正在尝试开发一个自定义JAAS登录模块,它使用一个令牌并从不同的来源获取用户数据。 它应该作为wildfly 8.2.1 final的身份验证领域。我有一个测试servlet,我想在其中进行身份验证,以便检查注入EJB的允许角色 来自这个网站的测试:事实上,我甚至从他的git项目开始 因为我只使用令牌,所以不能使用request.login(用户名、密码)启动wildfly登录过程。所以我试了一下: @Inject private SampleEJB sampleEJB; ... prot

我正在尝试开发一个自定义JAAS登录模块,它使用一个令牌并从不同的来源获取用户数据。 它应该作为wildfly 8.2.1 final的身份验证领域。我有一个测试servlet,我想在其中进行身份验证,以便检查注入EJB的允许角色

来自这个网站的测试:事实上,我甚至从他的git项目开始

因为我只使用令牌,所以不能使用
request.login(用户名、密码)
启动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用户身份登录?

在Java EE中不能以这种方式进行身份验证。使用给定的代码,您只能在
LoginContext
实例中进行身份验证

正如您已经发现的那样,request.login(用户名、密码)会触发身份验证过程,但仅限于用户名/密码凭据

在这种情况下,您不仅应该编写自定义LoginModule(identity store),还应该编写自定义身份验证机制。身份验证机制是身份验证过程中的控制器,而身份存储是模型

自定义身份验证机制可以通过jaspicspi添加,WildFly很好地支持jaspicspi

您可以使用一些实用程序代码从应用程序中注册一个
ServerAuthModule
(SAM),您可以从这里复制这些代码:

然后实际使用如下所示的代码注册SAM:


谢谢你,阿扬!在访问您的博客之后,我仍然不清楚,我必须实现哪些类?是否只有
javax.security.auth.message.module.ServerAuthModule
和配置wildfly,还是我必须编写更多的代码?您只能实现
ServerAuthModule
。我会更新答案的。好吧,我拿了你的git回购并开始玩它。我更改了servlet,尝试使用
request.getUserPrincipal().getName()
request.isUserInRole(“合作伙伴”)
,这是有效的。但是尝试访问带有
@RolesAllowed(“合作伙伴”)
注释的EJB不起作用。我收到一个无效的用户异常(JBAS014134:EJB调用失败…)我仍然错过了什么吗?>
我仍然错过了什么吗?
-您的代码可能是正确的,但WildFly 8.2.1包含一个导致此错误的错误。请看,它在WildFly 9中已修复,因此升级到WildFly 9或WildFly 10应该会修复它。它在WildFly 9中开始工作。只需启动repo并更改
ServerAuthModule
。如果其他人偶然发现此主题,请不要忘记添加安全域,如下所述: