三、Spring Security认证和授权-授权流程及源码解析

    科技2022-08-25  115

    上期我们学习了基于UsernamePasswordAuthenticationFilter的表单认证,接下来我们将对Spring Security授权相关知识点进行介绍并进行源码级解析。认证和授权是两个密不可分的好基友,只认证不授权,系统将不知道用户有哪些权限,能进行哪些操作。就像是一个公司只设置了门卫,只要是本公司职员就能进入(认证过程),但是没有明确的规章制度和上下级关系,进入公司以后具体有哪些权利和义务没人知道(授权),将导致公司陷入混乱无法运转。

    一、Spring Security 授权控制原理解析

    用户请求经过一系列的过滤器后到达FilterSecurityInterceptor,开始进行权限控制。 1、FilterSecurityInterceptor在调用doFilter之前调用其父类AbstractSecurityInterceptor的beforeInvocation()方法进行授权校验。 2、beforeInvocation()方法中调用了SecurityMetadataSource的getAttributes()方法获取访问该地址需要的权限。rquestMap是系统配置的地址对应的权限信息,拿此次请求的URL进行匹配,将匹配到的权限返回到调用方。 3、接下来获取用户认证信息,用户信息包含了该用户的访问权限。从SecurityContext中获取用户认证信息,判断,若用户西悉尼已认证且不需要重复认证则返回用户信息;否则对用户信息进行再次认证,成功后写入SecurityContext中。对于不清楚用户访问权限配置的同学可以看一下前一章节将讲的自定义AuthUserDetails类部分,里面定义了用户权限的生成规则。 4、此时,授权校验需要的权限信息已经准备就绪(该请求需要的权限attributes、用户认证信息authenticated以及请求信息object)。调用accessDecisionManager的decide()方法进行认证。默认情况下会使用AffirmativeBased的decide方法,选举器为WebExpressionVoter。选举不通过则会抛出AccessDeniedException异常。否则通过,表示该URL允许用户访问。AffirmativeBased实现AccessDecisionManager 的 decide 方法来实现授权,授权规则为: 1、只要有投通过(ACCESS_GRANTED)票,则直接判为通过。 2、如果没有投通过则 deny++ ,最后判断if(deny>0 抛出AccessDeniedException(未授权)

    二、授权表达式

    Spring Security允许我们通过Spring EL权限验证表达式来指定访问URL或方法所需要的权限,用户在访问某个URL或方法时,如果对应的权限验证表达式返回结果为true,则表示用户拥有访问该URL或方法的权限,如果返回结果为false,则表示没有权限。Spring Security为我们提供了以下的权限验证表达式:

    表达式描述permitAll总是返回true,表示允许所有的denyAll总是返回false,表示拒绝所有的anonymous当前用户是anonymous时返回truerememberMe表示当前用户是通过Remember-Me自动登录的返回trueauthenticated()表示当前用户不是anonymous时返回truefullyAuthenticated()如果当前用户既不是一个匿名用户,同时又不是通过Remember-Me自动登录的,则返回true。hasRole([role])当前用户是否拥有指定角色,角色要以“ROLE_”开头hasAnyRole([role1,role2])多个角色,是一个以逗号进行分隔的字符串,如果当前用户拥有指定角色中的任意一个则返回true,角色要以“ROLE_”开头hasAuthority([auth])当前用户是否拥有指定权限时返回true,但是不需要以“ROLE_”开头hasAnyAuthority([auth1,auth2])多个权限,是一个以逗号进行分隔的字符串,如果当前用户拥有指定权限中的任意一个则返回true,但是不需要以“ROLE_”开头hasIpAddress(‘127.0.0.1/24’)请求发送的IP匹配时返回true

    三、自定义可扩展的授权配置

    自定义一个授权配置提供器AuthorizeConfigProvider接口,各个模块和业务系统可以通过实现此接口向系统添加授权配置。 然后定义一个授权信息管理器,用于收集系统中所有 AuthorizeConfigProvider 并加载其配置。

    授权配置提供器AuthorizeConfigProvider接口: 默认授权配置提供器AuthorizeConfigProvider实现类DefaultAuthorizeConfigProvider,将权限模块相关URL直接放行:

    授权信息管理器AuthorizeConfigManager接口: 默认授权信息管理器类DefaultAuthorizeConfigManager,实现AuthorizeConfigManager接口,用于收集系统中所有 AuthorizeConfigProvider 并加载其配置,最后为未配置的URL增加统一认证权限: 其他业务系统中可以自定义授权配置提供器,实现AuthorizeConfigProvider接口即可。

    四、资源管理系统演示

    项目演示地址:http://175.24.75.121/#/login 用户名:visitor 密码:visitor

    五、GITHUB

    前端工程:https://github.com/STIll-clx/rms-admin-web 后端工程:https://github.com/STIll-clx/rms

    六、专题导航

    上一节:二、Spring Security认证和授权-基于表单的认证流程及源码解析 下一节:四、Spring Security认证和授权-动态权限管理解决方案

    欢迎点赞加关注哦!(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ❤

    Processed: 0.018, SQL: 9