当前位置: 首页 > 科技观察

再来说说SpringSecurity的新接口AuthorizationManager

时间:2023-03-13 19:35:19 科技观察

SpringSecurity5.5新增了一个授权管理器接口AuthorizationManager,接口动态权限的控制,方便我们使用。今天就来分享下最新的研究成果吧,一键四连走。拿一个玩吧,不要忘记与其他学生分享。AuthorizationManager用于检查当前的认证信息Authentication是否可以访问特定的对象T。AuthorizationManager概括了访问决策的抽象。@FunctionalInterfacepublicinterfaceAuthorizationManager{defaultvoidverify(Supplierauthentication,Tobject){AuthorizationDecisiondecision=check(authentication,object);//403如果授权决定未被批准if(decision!=null&&!decision.isGranted()){thrownewAccessDeniedException("AccessDenied");}//todo没有null的情况}//Hook方法。@NullableAuthorizationDecisioncheck(Supplierauthentication,Tobject);}我们只需要实现钩子方法check,会检查当前提供的认证信息authentication和泛化对象T,返回AuthorizationDecision,AuthorizationDecision。isGranted会判断当前资源是否可以访问。AuthorizationManager提供了两种使用方法。基于配置,为了使用AuthorizationManager,相关的配置是AuthorizeHttpRequestsConfigurer,与第9章的基于表达式的访问控制非常相似。AuthorizationManager-basedaccesscontrol.png在SpringSecurity5.5中,我们可以这样实现://注意和httpSecurity.authorizeRequests的区别httpSecurity.authorizeHttpRequests().anyRequest().access((authenticationSupplier,requestAuthorizationContext)->{//当前用户的权限信息,比如角色Collectionauthorities=authenticationSupplier.get().getAuthorities();//当前请求上下文//我们可以获取到携带的参数Mapvariables=requestAuthorizationContext.getVariables();//我们可以得到原始请求对象HttpServletRequestrequest=requestAuthorizationContext.getRequest();//todo可以最终决定是否授权isGrantedbooleanisGranted=true;returnnewAuthorizationDecision(isGranted);});门槛是不是低了很多?同样,它也可以用于注释。Annotation-basedAuthorizationManager也提供了基于注解的用法。不过在理解这个方法之前,先来看看它的实现类关系:AuthorizationManager的实现胖哥发现这也是从AuthorizationManager的实现推导出来的,最后找到了@EnableMethodSecurity注解,它的用法和@EnableGlobalMethodSecurity类似并支持相同的三个注释(请参阅EnableGlobalMethodSecurity)。用法几乎一样,打开注解即可使用:@EnableMethodSecurity(securedEnabled=true,jsr250Enabled=true)publicclassMethodSecurityConfig{}这里不再赘述。