Spring Security Cloud:通过 ZUUL 网关安全设置的 UI 服务

Posted

技术标签:

【中文标题】Spring Security Cloud:通过 ZUUL 网关安全设置的 UI 服务【英文标题】:Spring Security Cloud: UI service through a ZUUL gateway security setup 【发布时间】:2017-11-21 17:46:29 【问题描述】:

我在 UI 服务中正确设置身份验证和授权时遇到问题。

我目前有以下设置(全部使用 Spring.* 和 Spring Cloud.*):

- Config Service;
- Registry Service;
- Gateway Service (Zuul);
- Authentication Service (Spring Cloud Security, JWT);
- Company backend service (db <-> rest);
- Ui service;

就后端安全而言,一切正常:您通过来自身份验证服务的网关请求带有凭据的 JWT 令牌,如果所有匹配,则通过 REST 返回。

公司服务知道新令牌并在它出现时对其进行验证。

问题出在 UI 服务上。我目前正在做的是使用 Spring Boot 和 Thymeleaf 并手动构造 HttpHeaders、HttpEntity 和 Cookie 对象,而无需在前端部分使用 Spring Cloud Security 来访问 webapp 的某些部分。这是很多愚蠢的不必要的代码。我知道我无法理解如何将 Spring Cloud 安全性集成到我的 UI 服务中。

这是控制器方法之一的示例(非常丑陋):

@RequestMapping("/firms")
public String firm (Model model,
                    HttpServletRequest servletRequest,
                    HttpServletResponse servletResponse,
                    HttpSession httpSession) throws IOException 
    final String returnPage;
    Cookie cookie = authService.findCookie(servletRequest, servletResponse);
    HttpHeaders httpHeaders = authService.createJwtAuthHeader(cookie);
    HttpEntity requestEntity = new HttpEntity(httpHeaders);
    ResponseEntity <UserObject> userObjectResponse = authService.createUserResponseEntity(requestEntity, servletResponse);
    authService.setUserSessionDetails(userObjectResponse, httpSession);
    if (userObjectResponse != null && userObjectResponse.getBody() != null) 
        log.info(CommonMessages.GOT_COOKIE_FROM_AUTH_SERVICE.toString(), cookie.getName());
        returnPage = "firm";

     else 
        log.error(CommonMessages.NO_COOKIES_FOUND_NO_ACCESS_REDIRECTING.toString());
        httpSession.setAttribute("authorized", false);
        returnPage = "error";
    
    return returnPage;
 

也许有人遇到了类似的问题并找到了我可以用来将 Spring Cloud Security 正确集成到我的 UI 服务中的资源或示例?

谢谢!

【问题讨论】:

你找到docs.spring.io/spring-security/site/docs/4.2.3.RELEASE/…了吗? @Jeff 为此,我需要将我当前的设置与 UI 服务中的 Spring Cloud Security 集成。我不知道该怎么做。 当前端向后端发出请求时,它必须传递令牌,这是在授权标头中完成的。我会试着找到一个例子 Thymeleaf 似乎提供了集成:thymeleaf.org/doc/articles/springsecurity.html。但我在那里没有经验.. @Jeff 对不起,这是另一个问题。当我拥有 Oauth Spring 云授权微服务时,我需要了解如何设置自定义 Spring Cloud 安全性。 【参考方案1】:

这是一个方便的示例,您可能想看看:https://github.com/ddewaele/spring-cloud-security-samples/blob/master/sample1/gateway/src/main/resources/application.yml

这里的主要想法是用@EnableOAuth2Sso 标记您的服务,这样它就可以表现为OAuth 2.0 Client。这意味着它将执行以下操作:

将用户重定向到授权服务器,以便他们可以在那里输入他们的凭据。 在成功输入凭据后,期望最终用户使用授权代码从授权服务器重定向回来。这个授权码会自动换成Access Token。 可以使用OAuth2RestTemplate 调用其他微服务,该微服务会自动将访问令牌注入您的输出请求。在这种情况下,您调用的微服务必须使用 @EnableResourceServer 进行注释,这意味着它需要访问令牌才能处理请求。

有关此主题的更多信息,您可以查看我的另一个帖子here。

【讨论】:

我可以就这个话题与您联系吗?如果可能的话,我真的需要你的建议! 是的,当然。欢迎加入这个群组:chat.***.com/rooms/147391/spring-cloud-security

以上是关于Spring Security Cloud:通过 ZUUL 网关安全设置的 UI 服务的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Cloud Gateway 的 Spring Security 过滤器链中插入自定义过滤器

Spring Cloud 值Spring-Security

Spring cloud eureka 添加 spring-security

使用 spring-session 和 spring-cloud-security 时,OAuth2ClientContext (spring-security-oauth2) 不会保留在 Redis

Spring starter security or spring cloud security 如何保护整个微服务架构?

Spring Cloud Security Oauth2集成