2023年7月21日发(作者:)
Spring-Cloud架构⼊门(三)⽹关与服务鉴权⽅案--转载请注明出处⼀、⽹关ZuulSpringCloud的Zuul组件,为我们提供了路由转发的功能,同时在路由过程中,还可以进⾏⽇志打印,权限控制等功能。⽇志打印以及权限控制可以通过实现ZuulFilter来进⾏:package ;import lter;import tContext;import ent;import rvletRequest;@Componentpublic class MyFilter extends ZuulFilter { /** * 返回⼀个字符串代表过滤器的类型,在zuul中定义了四种不同⽣命周期的过滤器类型,具体如下: * pre 路由之前 * routing 路由之时 * post 路由之后 * error 发⽣错误时 * 常亮可以查看 FilterConstants */ @Override public String filterType() { return "pre"; } /** * 过滤器的过滤顺序 */ @Override public int filterOrder() { return 0; } /** * 这⾥可以写逻辑判断,是否要过滤,true,永远过滤。 */ @Override public boolean shouldFilter() { return true; } /** * 过滤器的具体逻辑。可⽤很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。 */ @Override public Object run() { RequestContext ctx = rentContext(); HttpServletRequest request = uest(); n(uestURI()); n(uestURL()); Object accessToken = ameter("token"); if(accessToken == null) { dZuulResponse(false); ponseStatusCode(401); try { ponse().getWriter().write("token is empty"); }catch (Exception e){} return null; } return null; }}上⾯的代码中,就进⾏了⼀个最简单的权限校验功能(实际的权限控制⽐这个复杂的多,下⾯会详细讲解)。通过Filter,还可以在⽹关层进⾏⽇志打印的功能,但是在⽇志打印时,需要注意我们进⾏打印请求头与响应体时,需要从Request和Response中获取IO流来进⾏打印,⽽普通IO是⽆法进⾏复⽤的,因此,需要注意在打印⽇志时,需要将⽂件下载上传类的接⼝过滤,以避免⽂件内容为空的问题。⼆、⽹关层服务鉴权⽅案⽹关层服务鉴权⽅案属于⼀种⽐较常见的服务鉴权⽅案,在权限需要灵活配置的情况下⽤此⽅案⽐较好,该⽅案的优势在于不与业务代码耦合,是否开放接⼝,可以通过后台进⾏设置,⽽不需要去变更代码。权限绑定关系:url -> 前端Model -> 权限包集合 -> ⽤户⾓⾊下⽅流程图即为鉴权流程:在上图中,任何⽤户访问后台需要经过以下步骤:1.请求被⽹关层拦截2.⽹关层请求鉴权服务进⾏鉴权,查看是否具有权限,不具备权限则将其拦截3.⽹关层转发⾄服务层同时,权限的url变更,只需要由后台⼈员对鉴权服务中的数据进⾏变更即可,不需要变更后端的服务代码,同时,后端的服务业务开发⼈员也不需要关注权限url的变更。三、Controller层AOP鉴权Controller层AOP鉴权与⽹关层鉴权有所不同,其权限绑定结构相⽐⽹关层鉴权,减少了⼀层url层的数据。权限绑定关系:前端Model -> 权限包集合 -> ⽤户⾓⾊同时,该⽅式鉴权优势也具有劣势。1.劣势要求被权限保护的接⼝不能被微服务内部访问,否则会造成重复鉴权。会导致权限与AOP的注解代码绑死,如果希望取消某个接⼝的权限,或者新增某个接⼝的权限,就需要对AOP的注解代码进⾏变更。2.优势可以将参数纳⼊权限控制。例如:⽤户A只具有“杭州”的数据的访问权限,那么就需要将请求参数纳⼊到鉴权的范围中,但是接⼝的参数模型是不⼀样的,此时利⽤AOP注解就可以进⾏轻松的鉴权配置,⽽⽹关层不⾏。可以减少配置的权限数量,并且去掉url层的权限数据,直接在AOP注解上配置前端Model层的权限信息。四、总结⽬前,在我周围使⽤SpringCloud的公司中,分采⽤⽹关层鉴权的⽅案进⾏鉴权的较多,但是两种⽅案本⾝是各有优劣的,并没有实际的孰好孰坏。其实本质上,权限的校验⽅案本⾝都⽐较通⽤化,但是因为权限本⾝,需要对⼤量的接⼝进⾏拦截处理,并且,每次鉴定权限在⽆缓存⽀撑的情况下,会每⼀次查询多张数据库表,吃掉⼤量的服务器性能。因此,在进⾏鉴权系统的开发时,⽆论采⽤哪⼀种⽅案,做好适当的多级缓存,才是重中之重。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1689899137a293266.html
评论列表(0条)