我正在寻求实现JWT身份验证,并从Java EE上的令牌中获取一些额外信息。
问题是我需要在我的web.xml
文件中使用“jwt”的自定义auth方法,但除了BASIC,DIGEST,FORM,CLIENT-CERT之外不支持此方法。
有没有办法实现自定义登录方法来启动身份验证过程?
我不需要客户端交互,并且将使用Bearer领域从调用应用程序填充Authorization标头。
即授权:持票人cn389ncoiwuencr
答案 0 :(得分:0)
请注意,这是在6.4 EAP上测试的,v7可能需要更改,特别是在使用阀门时。
您需要编写自定义xx.Authentication机制。您可以通过扩展org.apache.cataline.authenticator.FormAuthenticator并覆盖authenticate方法来完成此操作。
身份验证方法将执行
Principal principal = request.getUserPrincipal();
if (principal != null) {
logger.trace("User already authenticated");
return true;
}
Realm realm = context.getRealm();
principal = realm.authenticate("user", (String) null);
register(request, response, principal, "Bearer", "user", null);
return true;
然后可以在安全子系统下的standalone-xml中配置域。
<security-domain name="JWT">
<authentication>
<login-module code="xx.xx.xx.JWTLoginModule" flag="required">
</login-module>
</authentication>
</security-domain>
JWTLoginModule是一个使用https://github.com/jwtk/jjwt库的自定义LoginModule。有关登录模块的信息,请访问https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/6.3/html/Security_Guide/chap-Login_Modules.html。创建自己的扩展org.jboss.security.auth.spi.AbstractServerLoginModule。
然后,您需要将这些扩展添加到您的eap服务器的modules目录中,并具有与org.picketbox模块相同的模块依赖性。
这样就完成了服务器设置。现在您需要指示您的应用程序使用此设置:
在您的WEB-INF目录中创建: jboss-web.xml as
<jboss-web>
<security-domain>JWT</security-domain>
<valve>
<class-name>xx.Authentication</class-name>
</valve>
</jboss-web>
和在自定义模块中加载的jboss-deployment-structure
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="xx.custom"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
最后在您的web.xml文件中将您的身份验证方法更改为&#34; JWT&#34;。
打算创建一个开源版本,但在此之前必须这样做。