java 验证网关合法性_Spring gateway配置Spring Security实现统一权限验证与授权

在使用Spring Cloud 进行微服务,分布式开发时,网关是请求的第一入口,所以一般把客户端请求的权限验证统一放在网关进行认证与鉴权。因为Spring Cloud Gateway使用是基于WebFlux与Netty开发的,所以与传统的Servlet方式不同。而且网关一般不会直接请求数据库,不提供用户管理服务,所以如果想在网关处进行登陆验证与授权就需要做一些额外的开发了。

需求设求

众所周知,一切架构都必须按需求来设计,万能构架基本上是不存在的,即使是像Spring Security安全架构也只是实现了一个能用方式,并不是放之四海而皆准的,但是一个构架的良好扩展性是必须的,可以让使用者按照自己的需要进行扩展使用。所以为了说明本示例的实现,先假定这样一个需求

1,需要有一个Web网关服务进行权限统一认证

2,网关后面有一个用户管理服务,负责用户账号的管理

3,网关后面还存在其它的服务,但是这些服务需要认证成功之后才能访问

4,需要支持同一个请求可以被多个角色访问

主要技能点说明

修改默认登陆页面

在项目中添加完spring security依赖之后,如果不添加任何额外的配置,这时不管发送任何请求,都会跳到spring security提供的默认登陆页面。这显然不是我们想要的,那么第一步就是要显示自定义的登陆页面。

在Spring Gateway 网关项目中添加Security的配置,如下面代码所示:

@EnableWebFluxSecurity

public class WebSecurityConfig {

@Bean

public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {

RedirectServerAuthenticationEntryPoint loginPoint = new RedirectServerAuthenticationEntryPoint("/xinyue-server-a/account/index");

http.authorizeExchange().pathMatchers("/xinyue-server-a/easyui/**","/xinyue-server-a/js/**","/xinyue-server-a/account/index","/xinyue-server-a/account/login").permitAll()

.and().formLogin().loginPage("/xinyue-server-a/account/authen").authenticationEntryPoint(loginPoint)

.and().authorizeExchange().anyExchange().authenticated()

.and().csrf().disable();

SecurityWebFilterChain chain = http.build();

return chain;

}

}

这里有一个容易出现理解错误的地址,网上有好多示例说是直接只配置loginPage("/my/login")即可,这样配置的话,需要你的登陆页面,和提交登陆信息的form的action都必须是一致的,只不过,一个是get方式请求/my/login,一个是post方式请求/my/login,但是大多数据情况下,我们的登陆页面地址,和登陆form的action地址是分离的,所以需要按我上面的方式进行配置才可以。

http.authorizeExchange().pathMatchers("/xinyue-server-a/easyui/**","/xinyue-server-a/js/**","/xinyue-server-a/account/index","/xinyue-server-a/account/login").permitAll()

这个配置表示这些请求都不做验证,直接放过。

.and().formLogin().loginPage("/xinyue-serve

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值