我正在使用keychaft对用户进行身份验证。我用过
KeycloakInstalled keycloak = new KeycloakInstalled(config);
在第一个应用程序中,我可以对用户进行身份验证并生成令牌。
现在在下一步中,我想使用这个令牌在第二个应用程序中验证我的RESTAPI(两个应用程序都在同一个服务器上运行,只是端口不同)。为此,在我的第二份申请中,我增加了角色
‘*’
在约束映射中。
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS | org.eclipse.jetty.servlet.ServletContextHandler.SECURITY );
ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler();
context.setSecurityHandler(securityHandler);
securityHandler.addRole("*");
ConstraintMapping constraintMapping = new ConstraintMapping();
constraintMapping.setPathSpec("/*");
Constraint constraint = new Constraint();
constraint.setAuthenticate(true);
constraint.setRoles(new String[]{"*"});
constraintMapping.setConstraint(constraint);
securityHandler.addConstraintMapping(constraintMapping);
KeycloakJettyAuthenticator keyCloakAuthenticator = new KeycloakJettyAuthenticator();
AdapterConfig keyCloakConfig = new org.keycloak.representations.adapters.config.AdapterConfig();
keyCloakConfig.setRealm("myRealm");
keyCloakConfig.setAuthServerUrl("http://172.23.49.9:8180/auth");
keyCloakConfig.setSslRequired("none");
keyCloakConfig.setResource("my_resource");
Map<String,Object> credentials = new HashMap<String,Object>();
credentials.put("secret", "xxxxx-xxxxx-xx-877b-ssefssss");
keyCloakConfig.setCredentials(credentials);
keyCloakAuthenticator.setAdapterConfig(keyCloakConfig);
context.getSecurityHandler().setAuthenticator(keyCloakAuthenticator);
当我试图使用第一个应用程序生成的令牌通过浏览器访问应用程序中的安全资源时,如下所示:
http://localhost:7100/api/v1/test/code=generated_code
我得到以下错误:
HTTP错误:403访问问题
/api/v1/design/test/code=eyjhbgcioijsuz(为了可读性而截断)
原因:
!role
我犯了什么错误?
这是传递生成的令牌的正确方法吗:
/code=generated_token
?
注意:我已经确保两个应用程序中的keychaft配置完全相同。