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用户授权)