当前位置: 首页 >服务端 > Gateway中使用SpringSecurity进行网关鉴权与权限控制

Gateway中使用SpringSecurity进行网关鉴权与权限控制

上一篇文章:Gateway使用入门

GateWay作为网关路由是挡在了我们的系统最前边,进行动态路由配置和转发。那么我们就可以在网关层进行网关鉴权。

https://cloud.spring.io/spring-cloud-gateway/2.2.x/reference/html/

Gateway过滤器的介绍

之前说过GateWay的组件中有Filter(过滤器)这一功能,就是web开发的三大组件(Servlet、Filter、Listener)中的Filter,但是Gateway中使用的是WebFlux,而不是Servlet,有兴趣的可以了解下。在GateWay中有很多内置的过滤器,而且我们还可以自定义一个过滤器。

Gateway内置过滤器

生命周期

  • PRE: 这种过滤器在请求被路由之前调用。
  • POST:这种过滤器在路由到微服务以后执行。

类型

  • GatewayFilter 和Predicate一样,用在单个路由上

  • GlobalFilter 用在整个网关之前

自定义过滤器

自定义一个类实现这两个类就以了,直接上代码:

我们的需求就是,只有当你的请求参数中的useame=admin才给你放行。

/** * 微信公众号 “小鱼与Java” * <p> * 自定义一个GlobalFilter类 * * @date 2020/4/14 * @auther Lyn4ever */@Component //一定要让Spring管理这个beanpublic class CustomFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {/*这个request对象可以获取更多的内容比如,如果是使用token验证的话,就可以判断它的Header中的Token值了为了演示方便,我就判断了它的参数 */ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, String> queryParams = request.getQueryParams();String useame = queryParams.getFirst("useame");if (!useame.equals("admin")) {//不允许访问,禁止访问ServerHttpResponse response = exchange.getResponse();response.setStatusCode(HttpStatus.NOT_ACCEPTABLE); //这个状态码是406retu exchange.getResponse().setComplete();}//放行retu chain.filter(exchange);}/** * 这是Ordered接口的中的方法 * 过滤器有一个优先级的问题,这个值越小,优先级越高 * @retu */@Overridepublic int getOrder() {retu 0;}}

具体的演示就不做了,自行下载代码就可以

GateWay集成SpringSecurity

请自行具备一点儿SpringSecurity使用能力,如果不会的话,关注“小鱼与Java”后台回复SpringSecurity获取教程

Gateway用的是webflux,不同于Servlet,所以使用上会和在SpringMVC中使用有很大差别。官网地址

  • 引入依赖
<!--springsecurity依赖--><dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-security</artifactId></dependency>

引入这个依赖后,和我们使用SpringMVC时是一样的,输入任何地址后,都会重定向到login

Gateway中使用SpringSecurity进行网关鉴权与权限控制 _ JavaClub全栈架构师技术笔记

用户名:user

密码:启动应用时,在控制台上有打印出来的。

  • 配置类(主要是注入这几个bean)
@Configuration@EnableWebFluxSecuritypublic class SecurityConfig {/** * 用户的接口类 * @retu */@Beanpublic MapReactiveUserDetailsService userDetailsService() {	  //自定义一个用户UserDetails user = User.withDefaultPasswordEncoder().useame("admin").password("admin").roles("ADMIN").build();retu new MapReactiveUserDetailsService(user);}/** * 主要过滤配置类 * @param http * @retu */@Beanpublic SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {http.authorizeExchange().pathMatchers("/order/**").permitAll().pathMatchers("/user/**").hasRole("ADMIN").anyExchange().authenticated().and().httpBasic().and().formLogin();retu http.build();}}
  • 在Gateway中使用SpringSecurity其实就是在Webflux中使用SpringSeccurity。因为Gateway本就是基于Spring5的响应式编程,在性能上要比SpringMVC(传统的Servlet)开发好很多。

代码地址:关注微信公众号“小鱼与Java”,回复SpringCloud获取

Gateway中使用SpringSecurity进行网关鉴权与权限控制 _ JavaClub全栈架构师技术笔记

作者:小鱼吃猫
来源链接:https://www.cnblogs.com/Lyn4ever/p/12702331.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/server/113166.html

标签:Gateway
分享给朋友:

“Gateway中使用SpringSecurity进行网关鉴权与权限控制” 的相关文章

Java日志框架那些事儿 2022年05月19日 20:04:37
中间件RabbitMQ 2022年05月23日 16:45:42
go mod 相关的八个命令 2022年05月23日 20:17:45
Dart微基准测试第一部分 2022年05月23日 20:48:42
关于设计模式 2022年05月23日 23:02:13
信息系统项目管理师 案例1 2022年05月24日 23:38:07