All Projects → fwing1987 → SpringBoot-Shiro-Vue

fwing1987 / SpringBoot-Shiro-Vue

Licence: other
前后端分离的权限认证

Programming Languages

java
68154 projects - #9 most used programming language
javascript
184084 projects - #8 most used programming language
Vue
7211 projects
CSS
56736 projects
PLpgSQL
1095 projects
HTML
75241 projects

       所有源码可以在github上找到,文章参考: 提供一套基于Spring Boot-Shiro-Vue的权限管理思路.前后端都加以控制,做到按钮/接口级别的权限,做了自己的实现,练了下手。前文见:前后端分离项目中权限控制的思考,以及实现过程中的瞎折腾:SpringBoot+Shiro瞎折腾——不使用Shiro的Filter模式
       PS:前端代码使用的是:vue-admin-template

一、Shiro基本概念

       参见前文:Shiro基本概念,里面有些术语理解起来可能没那么直观,配合下面的实例代码,看看是如何使用的,可以辅助理解。
       

二、WEB的典型用户验证流程

       特意将Cookie与SessionManager单独出来,是因为这两个是可选的,可配的:

  • Cookie可以选择不使用,只将sessionId存放在页面的内存中,这时页面被关闭,sessionId也就丢失了,当然,服务端还存在一个类似野指针的session;也可以选择使用localStorage;
  • SessionManager,Shiro提供一个默认的DefaultWebSessionManager,是使用MemorySessionDAO在服务端的内存中保存session,但存在几个问题,不推荐在生产环境中使用:
    1. 无法持久化,服务端重启下session就丢了;
    2. 容易内存溢出;
    3. 集群模式下无法session共享;

三、实现

       理一下思路,前后端分离权限验证与普通Web服务的权限验证有啥不同,其实就一个:前后端变成了只交互数据,展开来说,是后端少了两个对前端的控制:

  • 页面路由
  • 页面DOM

       所以针对普通的web服务,需要做出如下修改:

  1. 路由相关:

    • 未验证页面不能直接Shiro跳转,而是返回未登录错误,由前端实现
    shiroFilterFactoryBean.setLoginUrl("/unauth");
    @RequestMapping("/unauth")
    @ResponseBody
    public Result unauth(){
        Result result = new Result(100);
        result.message = "未登录";
        return result;
    }
    • 配置所有URL为不需要登录验证,而由前端根据后端返回的权限数据来路由(别和不需要权限验证混了,只是因为路由不需要后端来做而已,所有需要权限验证的业务逻辑都需要有权限较验)
    filterChainDefinitionMap.put("/", "anon");
    • 前端需要根据返回的权限数据进行路由配置,具体到Vue使用Vue router的addRoutes动态添加路由
  2. DOM相关

    • 前端根据后端返回的权限数据决定菜单或按钮的展示
  3. 跨域,这个是前后端分离带来的新问题(如果分开部署)

    • 后端需要配置允许跨域(添加@CrossOrigin或使用Filter)

       没了,就需要修改这么多,具体实现就不贴大量代码了,源码见github。后续再尝试添加一下Redis的Session支持

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].