Servlets 使用Wildfly的JAAS自定义登录模块
我正在尝试开发一个自定义JAAS登录模块,它使用一个令牌并从不同的来源获取用户数据。 它应该作为wildfly 8.2.1 final的身份验证领域。我有一个测试servlet,我想在其中进行身份验证,以便检查注入EJB的允许角色 来自这个网站的测试:事实上,我甚至从他的git项目开始 因为我只使用令牌,所以不能使用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
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
。如果其他人偶然发现此主题,请不要忘记添加安全域,如下所述: