- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 Spring Cloud 有点陌生。我正在尝试使用 Spring Cloud Eureka Discovery 和 Zuul Gateway 构建一些微服务。
我可以通过 Zuul Gateway 访问微服务并执行操作,但前提是不涉及安全。如果我的微服务是安全的,那么我无法通过 Zuul 执行任何操作,因为它不会返回 JWT token 。如果我通过 Eureka 发现客户端来做到这一点,它就像一个魅力。
也许我的 Zuul 配置有问题?或者我可能选择了一种无效的方式来保护服务?提前致谢!
这是我的 Zuul 网关配置:
Application.class
@SpringBootApplication
@EnableZuulProxy
@EnableDiscoveryClient
public class GatewayServiceApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayServiceApplication.class, args);
}
@Bean
public Filter shallowEtagHeaderFilter() {
return new ShallowEtagHeaderFilter();
}
}
application.properties
eureka.client.service-url.defaultZone=http://localhost:8010/eureka/
server.port=8011
zuul.prefix=/services
bootstrap.properties
spring.application.name=gateway-service
# specify where config server is up
spring.cloud.config.uri=http://localhost:8001
这是我的微服务 JWT 和安全配置:
WebSecurityConfig.class
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure (HttpSecurity http) throws Exception {
http.csrf().disable().authorizeRequests()
.antMatchers(HttpMethod.POST, "/login").permitAll()
.anyRequest().authenticated()
.and()
// We filter the api/login requests
.addFilterBefore(new JWTLoginFilter("/login", authenticationManager()), UsernamePasswordAuthenticationFilter.class)
// And filter other requests to check the presence of JWT in header
.addFilterBefore(new JWTAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}
@Override
protected void configure (AuthenticationManagerBuilder auth) throws Exception {
// Create a default account
auth.inMemoryAuthentication()
.withUser("**")
.password("**")
.roles("**");
}
}
TokenAuthenticationService.class
public class TokenAuthenticationService {
static final long EXPIRATIONTIME = 864_000_000; // 10 days
static final String SECRET = "*";
static final String TOKEN_PREFIX = "Bearer";
static final String HEADER_STRING = "Authorization";
static void addAuthentication (HttpServletResponse res, String username) {
String JWT = Jwts.builder()
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATIONTIME))
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
res.addHeader(HEADER_STRING, TOKEN_PREFIX + " " + JWT);
}
static Authentication getAuthentication (HttpServletRequest request) {
String token = request.getHeader(HEADER_STRING);
if (token != null) {
// parse the token.
String user = Jwts.parser()
.setSigningKey(SECRET)
.parseClaimsJws(token.replace(TOKEN_PREFIX, ""))
.getBody()
.getSubject();
return user != null ?
new UsernamePasswordAuthenticationToken(user, null, Collections.emptyList()) :
null;
}
return null;
}
}
JWTLoginFilter.class
public class JWTLoginFilter extends AbstractAuthenticationProcessingFilter {
public JWTLoginFilter (String url, AuthenticationManager authManager) {
super(new AntPathRequestMatcher(url));
setAuthenticationManager(authManager);
}
@Override
public Authentication attemptAuthentication (HttpServletRequest req, HttpServletResponse res)
throws AuthenticationException, IOException, ServletException {
AccountCredentials creds = new ObjectMapper().readValue(req.getInputStream(), AccountCredentials.class);
return getAuthenticationManager().authenticate(
new UsernamePasswordAuthenticationToken(
creds.getUsername(),
creds.getPassword(),
Collections.emptyList()
)
);
}
@Override
protected void successfulAuthentication (HttpServletRequest req,
HttpServletResponse res,
FilterChain chain,
Authentication auth)
throws IOException, ServletException {
TokenAuthenticationService.addAuthentication(res, auth.getName());
}
}
JWTAuthenticationFilter.class
public class JWTAuthenticationFilter extends GenericFilterBean {
@Override
public void doFilter (ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
Authentication authentication = TokenAuthenticationService.getAuthentication((HttpServletRequest) servletRequest);
SecurityContextHolder.getContext().setAuthentication(authentication);
filterChain.doFilter(servletRequest, servletResponse);
}
}
最佳答案
尝试定义以下内容。
zuul.sensitiveHeaders=Cookie,Set-Cookie
在zuul中,Cookie、Set-Cookie和Authroization header 是默认的敏感 header 。如果您想在 api 服务器中使用 Authroization header ,则需要重新定义它,而不像上面那样使用 Authroization
header 。
您还可以为每条路线定义它。请参阅文档:http://cloud.spring.io/spring-cloud-netflix/spring-cloud-netflix.html [Cookie 和敏感 header ]
关于java - Spring Cloud : Microservice authentication works through Eureka Discovery, 但不是通过 Zuul,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43489887/
我们计划开发一些基于 play 框架的微服务。他们将提供 rest api,其中很多将在幕后使用 akka cluster/cluster-sharding。 我们想要一个 api 网关来公开我们内部
我想知道是否可以使用NestJs ClientProxy从NestJs微服务向其他非NestJs微服务(例如:Spring Boot微服务)发出请求。我已经在谷歌上搜索了一段时间,但我还没有看到任何关
我很难找到答案。当我有两个Spring Boot微服务应用程序,微服务A和微服务B,并且它们都相互通信时,我遇到了一个问题。当微服务A在身份验证后生成JWT令牌并向微服务B发送响应时,微服务B如何验证
我很难找到答案。当我有两个Spring Boot微服务应用程序,微服务A和微服务B,并且它们都相互通信时,我遇到了一个问题。当微服务A在身份验证后生成JWT令牌并向微服务B发送响应时,微服务B如何验证
我们正在评估使用事件作为来源来构建报告,并增加了许多不同的选项。 我们目前正在服务结构集群中运行我们的系统(打算在未来某个时候迁移到 kubernetes),这意味着各种事件流的订阅者默认情况下将存在
是否可以通过微服务构建使用不同语言的项目?比如,我想搭建一个酒店管理系统,是否可以针对不同的模块同时使用asp.net core和nodejs。认为我想使用 nodejs 获取数据并使用 .net c
我将用 Twitter 说明我的问题。例如,Twitter 具有基于微服务的架构,这意味着不同的进程位于不同的服务器中并具有不同的数据库。 出现一条新推文,服务器 A 在其自己的数据库中存储了一些数据
我是微服务的新手,我遇到了异常。我只收到过几次,无法继续。 eureka_1 | 2019-02-25 15:08:22.666 ERROR 1 --- [target_eureka-7] c.n.e
微服务应该是可重用的吗?对于可重用,我并不是说共享特定领域的模型。 我的意思是,为一个应用程序创建的微服务是否应该在另一个应用程序中重用?如果它们可以在应用程序中重复使用就足够了吗? 解耦微服务的最佳
我将为我的数据仓库应用程序应用微服务。应用中有 4 个主要的微服务: 1)数据服务:将外部数据源导入/导出到DWH并从DWH查询数据。 2) 分析服务:用于 UI 上的图表可视化 3)机器学习:用于推
我有 2 个微服务 S1和 S2 . S1调用 S2更新数据然后 S1插入另一条数据,但让我们考虑 S1失败,那么我们需要回滚S2更新的数据否则我们将处于不一致的状态。 我也经历过 Saga 模式。它
我一直在阅读微服务架构但我仍然无法理解微服务间的通信机制。 在许多文章中,他们说微服务通常通过 RESTful API 公开。但是当您搜索互联网时,您总是会看到基于消息和事件的后端通信实现。 所以我很
让我们考虑一种情况,其中多个服务中继可以随时更改的数据,并且应该在每个微服务中大致同时更新 - 例如,有一个受支持的语言列表或一些可能有一天会更改并影响许多的公共(public)策略一次服务。 我能想
我听说过通用术语“上游服务”和“下游服务”这两个术语,但是我遇到了一些关于微服务架构的文章,他们在其中使用了这些术语,但是我无法获得上游和下游服务的含义在基于微服务的架构中会是什么?有人有一个简短的解
例如amazon.com;他们依赖于微服务架构,订单和付款可能是单独的微服务,但是当您在 amazon.com 上结帐订单时,您最终可以看到订单 ID 和详细信息。如果不是最终一致性方法,那是什么?也
让我们假设以下基于CQRS体系结构的简单UC: 电影说,我们有一个后端来管理业务对象。 此后端由2个微服务组成:CommandManager(创建/更新/删除影片)和QueryManager(查询影片
似乎在传统的微服务架构中,每个服务都有自己的数据库,对数据的理解不同(描述 here)。有时,数据库复制数据被认为是允许的。例如,“用户”服务可能基本上了解用户的所有信息,而“帖子”服务可能只存储主键
鉴于我有两个微服务:服务 A 和服务 B。 服务 A 拥有完整的客户数据,而服务 B 需要这些数据的一小部分(它通过一些批量加载从服务 A 获取)。 这两种服务都将客户存储在自己的数据库中。 如果然后
我正在开发一个带有微服务的应用程序,但我不知道如何分发微服务以允许身份验证。 我读过每个微服务都应该有自己的数据库以避免耦合。 问题是身份验证(通过 JWT)和用户微服务必须有权访问相同的数据库和表(
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 去年关闭。 Improve this questio
我是一名优秀的程序员,十分优秀!