在 ear 中对多个 Web 应用程序使用一次身份验证

Using one authentication with several web applications inside ear

我有一个基于 JSF 的 Web 应用程序,它使用表单身份验证。安全域在 jboss 配置中设置。我还有一个包含 REST-API 的 JAX-RS 应用程序,我希望它的某些方法只能由在第一个应用程序中经过身份验证的用户访问。
我查看了 jasig CAS,但对于我的目的来说它似乎有点重,我想有一个更简单的解决方案,也许你们会帮助我找到它。 提前致谢。

你所需要的可以用Oauth来解决。

您的后端 (REST-API) 需要经过身份验证才能访问您的 API 操作。反过来,您的前端(基于 JSF 的 Web 应用程序)在与后端通信时将需要发出经过身份验证的请求。这是通过发送 access tokens.

来实现的

虽然这看起来很复杂,但看一下 Stormpath. We have quite a straightforward solution for this. Please take a look at Using Stormpath for API Authentication 对您非常有用。

总而言之,您的解决方案如下所示:

  1. 您将使用 Stormpath Java SDK 轻松委派所有用户管理需求。
  2. 在您的前端,当用户按下登录按钮时,您的前端将通过其 REST API.

    安全地将凭证发送到您的后端

    2.1。顺便说一下,Stormpath 大大增强了这里的所有可能性。您可以通过 IDSite, or you can also delegate it to our Servlet Plugin 将 login/register 功能完全委托给 Stormpath,而不是拥有自己的登录页面。 Stormpath 还支持 Google、Facebook、LinkedIn 和 Github 登录。

  3. 您的后端将尝试根据 Stormpath 后端对用户进行身份验证,结果将 return access token

    /** This code will throw an Exception if the authentication fails */
    public void postOAuthToken(HttpServletRequest request, HttpServletResponse response) {
        Application application = client.getResource(applicationRestUrl, Application.class);
    
        //Getting the authentication result
        AccessTokenResult result = (AccessTokenResult) application.authenticateApiRequest(request);
    
        //Here you can get all the user data stored in Stormpath
        Account account = accessTokenResult.getAccount();
    
        response.setStatus(HttpServletResponse.SC_OK);
        response.setContentType("application/json");
    
        //Output the json of the Access Token
        response.getWriter().print(token.toJson());
        response.getWriter().flush();
    }
    
  4. 然后,对于每个经过身份验证的请求,您的后端将执行:

    public void getEquipment(HttpServletRequest request, HttpServletResponse response) {
        Application application = client.getResource(applicationRestUrl, Application.class);
    
        OauthAuthenticationResult result = (OauthAuthenticationResult) application.authenticateOauthRequest(request).execute();
    
        System.out.println(result.getApiKey());
        System.out.println(result.getAccount());
    
        //Return what you need to return in the response
        handleEquipmentRequest(response);
    }
    

请查看here了解更多信息

希望对您有所帮助!

免责声明,我是活跃的 Stormpath 贡献者。