2.shiroFilter

当 Shiro 被运用到 web 项目时,Shiro 会自动创建一些默认的过滤器对客户端请求进行过滤。比如身份验证、授权等 相关的。

默认拦截器可以参考 org.apache.shiro.web.filter.mgt.DefaultFilter中的枚举 拦截器:

以下是 Shiro 提供的过滤器:

过滤器简称
对应java类
描述
例子
过滤器简称
对应java类
描述
例子
anon org.apache.shiro.web.filter.authc.AnonymousFilter 表示该 uri 可以匿名访问 /admins/**=anon
authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter 表示该 uri 需要认证才能访问 /admins/**=auth
authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter 表示该 uri 需要 httpBasic 认证 /admins/**=authcBasic
perms org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter 表示该 uri 需要认证用户拥有 user:add:* 权限才能访问 /admins/**=perms[user:add:*]
port org.apache.shiro.web.filter.authz.PortFilter 表示该 uri 需要使用 8081 端口 /admins/**=port[8081]
rest org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter  /admins/**=perms[user:method],其中,method 表示 get、post、delete 等 /admins/**=rest[user]
roles org.apache.shiro.web.filter.authz.RolesAuthorizationFilter 表示该 uri 需要认证用户拥有 admin 角色才能访问 /admins/**=roles[admin]
ssl org.apache.shiro.web.filter.authz.SslFilter 表示该 uri 需要使用 https 协议 /admins/**=ssl
user org.apache.shiro.web.filter.authc.UserFilter 表示该 uri 需要认证或通过记住我认证才能访问 /admins/**=user
logout org.apache.shiro.web.filter.authc.LogoutFilter 表示注销,可以当作固定配置 /logout=logout
noSessionCreation org.apache.shiro.web.filter.session.NoSessionCreationFilter 阻止在请求期间创建新的会话,以保证无状态的体验  

shiro过滤器族谱

authc,authcBasic对应的类继承认证过滤器
perms,port,rest,roles,ssl对应的类继承授权过滤器

shiro过滤器流程

1.将ShiroFilterFactoryBean注入容器中时,会对执行getObject(),该方法中有一个createInstance();

 2.createInstance()方法中会创建过滤链管理器,也就是将filterChainDefinitionMap中的路径与相应的权限、过滤器进行绑定。

 3.进入createFilterChainManager()后,主要执行三个步骤:

 第一个步骤获取默认的权限过滤器,主要是在DefaultFilterChainManager初始化时会进行addDefaultFilters(false)方法.

 

 

 以下为DefaultFilter

第二个步骤为将自定义的过滤器添加至过滤链管理器

第三个步骤为创建过滤链

首先会将权限信息分割,将String字符串分解为字符数组,chainDefinition为权限字符串,例如 “authc,roles[admin,user],perms[user:add]” ->{“authc”,"roles[admin,user]","perms[useradd]"},接着执行toNameConfigPair(token),主要就是将权限信息和权限名进行分离,例如:roles[admin,user]-{"roles","admin,user"}

执行addToChain()方法,参数chainName为接口路径,参数nameConfigPair[0]为权限名,参数nameConfigPair[1]为权限信息

 

 进入addToChain执行applyChainConfig(),chainName为接口路径,filter为过滤器名,chainSpecificFilterConfig为权限信息。

 进入applyChainconfig(),chainName为接口路径,chainSpecificFilterConfig为权限信息。

 290行主要就是将过滤器与路径和权限进行绑定,以K-V的形式将过滤器和路径权限进行绑定。

 292-293行主要为将路径与相应的过滤器进行绑定

 

 4.当用户发出一个请求时,会先从AdviceFilter的perHandle进入PathMatchingFilter中preHandle(),对该路径和过滤器中设置的路径进行匹配

 当路径匹配通过时,会通过路径获取到对应的权限值,比较器使用的是AntPathMatcher

 进入isFilterChainContinued()方法,path表示接口路径,pathConfig表示权限值。

 5.进入onPreHandle()方法,当登入时isAccessAllowed()执行此方法,当没有登入时执行onAccessDenied()方法

 

 6.这里进入的是PermissionsAuthorizationFilter中的isAccessAllowed()方法

 7.最后通过调用subject.isPermitted(perm[0])方法进行权限校验(具体可查看 4用户授权

posted @ 2022-03-28 13:23  我所理解的代码  阅读(607)  评论(0)    收藏  举报