• Shiro:中的filterChainDefinitions详解。


    springrain使用shiro控制权限,配置filterChainDefinitions结合数据库校验权限。

    我们在web.xml中配置一个全局过滤器,也就是在springrain配置的是一个spring bean的“shiroFilter“,在这个bean中可以根据访问路径在配置不同的过滤器,其中shiro默认自带的过滤器如下:

    Filter Name

    Class

    説明

    anon

    org.apache.shiro.web.filter.authc.AnonymousFilter

    任何人都可以访问

    authc

    org.apache.shiro.web.filter.authc.FormAuthenticationFilter

    必须是登录之后才能进行访问,不包括remember me

    authcBasic

    org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter

    logout

    org.apache.shiro.web.filter.authc.LogoutFilter

    noSessionCreation

    org.apache.shiro.web.filter.session.NoSessionCreationFilter

    perms

    org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter

    指定过滤规则,这个一般是扩展使用,不会使用原生的

    port

    org.apache.shiro.web.filter.authz.PortFilter

    rest

    org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter

    roles

    org.apache.shiro.web.filter.authz.RolesAuthorizationFilter

    ssl

    org.apache.shiro.web.filter.authz.SslFilter

    user

    org.apache.shiro.web.filter.authc.UserFilter

    登录用户才可以访问,包含remember me

    我们平时使用就是anno,任何人都可以访问;authc:必须是登录之后才能进行访问,不包括remember me;user:登录用户才可以访问,包含remember me;perms:指定过滤规则,这个一般是扩展使用,不会使用原生的;其中filterChainDefinitions 就是指定过滤规则的,一般公共配置使用配置文件,例如jss css img这些资源文件是不拦截的,相关业务的url配置到数据库,有过滤器查询数据库进行权限判断。

    例:springrain的配置如下图:

    拦截器的优先级:从上到下,从左到右,如果有匹配的拦截器就会阻断并返回,例如:访问js/a.js,第一个拦截器anon符合,就返回true了,不在往下进行匹配了,注意最后一个拦截最后一句是 /**=user,frameperms 意思就是除了上面的那些,其他的所有都要经过 ,user和frameperms.如果没有登陆 user就会阻断,不会执行到frameperms.frameperms 就是我们自定义实现的过滤器,从数据库中查询用户的权限,判断当前用户是否有权限访问拦截的url.

    拦截的工作流程

    • 认证和授权的 realm.例如springrain扩展的shiroDbRealm,在doGetAuthorizationInfo授权方法里

      // 添加角色及权限信息
      SimpleAuthorizationInfo sazi = new SimpleAuthorizationInfo();
      try {
      sazi.addRoles(userRoleMenuService.getRolesAsString(userId));
      sazi.addStringPermissions(userRoleMenuService
      .getPermissionsAsString(userId));
      } catch (Exception e) {
      logger.error(e);
      }

      return sazi;

    • sazi.addRoles:获取当前用户所有的角色,用于依据角色判断权限的shiro过滤器,springrain中没有使用

    • sazi.addStringPermissions:获取当前用户的所有权限,springrain中的权限就是url,所以在springrain中这就是一个url的集合

    • 我们的拦截器每次校验权限都会调用doGetAuthorizationInfo,获取当前用户的所有权限.

    • 我们的权限拦截器 只要判断当前用户访问的url是否在他的权限集合内就可以了,例如 springrain中frameperms 的校验url权限:

      //会调用realm的doGetAuthorizationInfo授权方法
      permitted= subject.isPermitted(uri);

  • 相关阅读:
    代码随想录算法训练营第五十二天 | 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV
    华为昇腾NPU卡 大模型LLM ChatGLM2模型推理使用
    【LVGL事件(Events)】事件在不同组件上的应用(一)
    现货黄金职业交易员怎么使用技术分析?
    AWS Skill Builder - 练习 ACF 认证的第一站
    lenovo联想笔记本ThinkPad P16V Gen 1(21FC,21FD)原装出厂Win11系统
    Word2Vec浅谈
    2023-油猴(Tampermonkey)脚本推荐
    【博学谷学习记录】超强总结,用心分享|Hive开窗函数
    算法笔记-第十章-图的遍历(未处理完-11.22日)
  • 原文地址:https://blog.csdn.net/m0_67393413/article/details/126596309