提供一套基于Spring Boot-Shiro-Vue的权限管理思路.前后端都加以控制,做到按钮/接口级别的权限

Overview

Spring Boot-Shiro-Vue

提供一套基于SpringBoot-shiro-vue的权限管理思路.

前后端都加以控制,做到按钮/接口级别的权限

DEMO

测试地址

admin/123456 管理员身份登录,可以新增用户,角色.

角色可以分配权限

控制菜单是否显示,新增/删除按钮是否显示

设计思路

核心

每个登录用户拥有各自的N条权限,比如 文章:查看/编辑/发布/删除

后端

基于 RBAC新解 .

通常我们的权限设计都是 用户--角色--权限 ,其中角色是我们写代码的人没法控制的,它可以有多条权限,每个用户又可以设计为拥有多个角色.因此如果从角色着手进行权限验证,系统都必须根据用户的配置动起来,非常复杂.

所以我们后台设计的关键点就在于: 后台接口只验证权限,不看角色.

角色的作用其实只是用来管理分配权限的,真正的验证只验证权限 ,而不去管你是否是那种角色.体现在代码上就是接口上注解为

@RequiresPermissions("article:add")

而不是

@RequiresRoles(value = {"admin","manager","writer"}, logical = Logical.OR) 

前端

采用了vueAdmin-template , ElementUI , 权限设计思路也是参考了 vueAdmin 的动态路由的设计.

后端负责了接口的安全性,而前端之所以要做权限处理,最主要的目的就是隐藏掉不具有权限的菜单(路由)和按钮.

登录系统后,后端返回此用户的权限信息,比如

 "userPermission":{  
         "menuList":[  
            "role",
            "user",
            "article"
         ],
         "roleId":1,
         "nickname":"超级用户",
         "roleName":"管理员",
         "permissionList":[  
            "article:list",
            "article:add",
            "user:list",
         ],
         "userId":10003
      }

根据menuList判断给此用户生成哪些路由, 根据permissionList判断给用户显示哪些按钮,能请求哪些接口.

数据库

最主要的是要有一张本系统内的全部权限明细表,比如下面这样 权限表 权限数据

如果某用户拥有表格中前五条权限,就可以查出他就拥有article和user两个菜单,至于页面内是否显示(新增)(修改)按钮,就根据他的permissionList来判断.

具体实现

有了思路,就可以根据各自的业务进行实现,本项目在此进行了简单的实现,后端代码在back文件夹,前端代码在vue文件夹.前端启动只需

npm install
npm run dev

后端就是常规的shiro配置,前端代码如果看不明白,可以参考前端权限代码说明

分配权限页面效果

分配权限页面

Issues
  • 怎么实现部署呢

    怎么实现部署呢

    看到前后端的代码是分离的,怎么部署呢?

    opened by benyVip 16
  • 登录问题 org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported

    登录问题 org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported

    我将你的项目部署到idea后,前后端都可以启动,但是登录的时候后台报错了。

    org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:224) at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:157) at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:130) at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:124) at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:165) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:998) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:901)

    opened by yanwencaihubei 13
  • 跨域要怎么处理?

    跨域要怎么处理?

    咨询一下,不采用代理的方式实现,添加跨域拦截后,默认都跳转到AjaxPermissionsAuthorizationFilter的onAccessDenied方法里面,前面的异常怎么跟踪?

    opened by cliff01 12
  • 後端build後執行jar

    後端build後執行jar

    image

    版大你好 我執行後端時,只出現這兩行,未顯示tomcat運行,是正常運行嗎? 若我前端想用其他框架,想先用postman api先測試功能,請問要怎麼打? Thanks.

    opened by Mtwbs 12
  • 用户信息可以成功保存到 session,但是后面从 session 中获取不到

    用户信息可以成功保存到 session,但是后面从 session 中获取不到

    执行语句 SecurityUtils.getSubject().getSession().setAttribute(ShiroConstant.SESSION_USER_INFO, user); 后,用户信息是成功保存上了的,但是后面再通过 (User) session.getAttribute(ShiroConstant.SESSION_USER_INFO); 获取时,结果为null

    opened by guoguocai 9
  • 关于接口注解的问题

    关于接口注解的问题

    我发现接口上的注解,注释掉完全不影响功能,所以想问题这个注解是在哪用到的呢?代码里也没看到在哪针对接口上的注解做处理

    opened by yeruilong 8
  • 好,需要帮忙,我发到服务器的时候,会出现Long类型不精准,用本地的运行,Long类型会String,没此问题

    好,需要帮忙,我发到服务器的时候,会出现Long类型不精准,用本地的运行,Long类型会String,没此问题

    @Configuration public class DefaultView extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper = new ObjectMapper(); /** * 序列换成json时,将所有的long变成string * 因为js中得数字类型不能包含所有的java long值 / SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); objectMapper.registerModule(simpleModule); jackson2HttpMessageConverter.setObjectMapper(objectMapper); converters.add(jackson2HttpMessageConverter); } // /* // *

    Description: 解决js处理long型丢失精度问题,将long转换成long

    // * @author hanchao // * @date 2018/7/23 下午4:31 // */ // @Override // public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // //定义Json转换器 // MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = // new MappingJackson2HttpMessageConverter(); // //定义对象映射器 // ObjectMapper objectMapper = new ObjectMapper(); // //定义对象模型 // SimpleModule simpleModule = new SimpleModule(); // //添加对长整型的转换关系 // simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance); // simpleModule.addSerializer(Long.class, ToStringSerializer.instance); // simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); // //将对象模型添加至对象映射器 // objectMapper.registerModule(simpleModule); // //将对象映射器添加至Json转换器 // jackson2HttpMessageConverter.setObjectMapper(objectMapper); // // //在转换器列表中添加自定义的Json转换器 // converters.add(jackson2HttpMessageConverter); // //添加utf-8的默认String转换器 // converters.add(new StringHttpMessageConverter(Charset.forName("UTF-8"))); // } @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("forward:/index.html"); // registry.addViewController("/").setViewName("public/index.html"); registry.setOrder(Ordered.HIGHEST_PRECEDENCE); super.addViewControllers(registry); } }

    opened by hzhh110 8
  • 前后端如何在IDEA部署的呢

    前后端如何在IDEA部署的呢

    你好,我把整个项目下载下来了 请问一下,如何在idea里面运行起来呢

    opened by Nick6699 8
  • 开发工具

    开发工具

    请问使用什么开发工具 和 开发环境 ,希望有时间帮忙解答

    opened by LadyTeng 8
该仓库中主要是 Spring Boot 的入门学习教程以及一些常用的 Spring Boot 实战项目教程,包括 Spring Boot 使用的各种示例代码,同时也包括一些实战项目的项目源码和效果展示,实战项目包括基本的 web 开发以及目前大家普遍使用的线上博客项目/企业大型商城系统/前后端分离实践项目等,摆脱各种 hello world 入门案例的束缚,真正的掌握 Spring Boot 开发。

Spring Boot Projects 该仓库中主要是 Spring Boot 的入门学习教程以及一些常用的 Spring Boot 实战项目教程,包括 Spring Boot 使用的各种示例代码,同时也包括一些实战项目的项目源码和效果展示,实战项目包括基本的 web 开发以及目前大家普遍使用的前

十三 3.7k May 9, 2021
一个涵盖六个专栏:Spring Boot 2.X、Spring Cloud、Spring Cloud Alibaba、Dubbo、分布式消息队列、分布式事务的仓库。希望胖友小手一抖,右上角来个 Star,感恩 1024

友情提示:因为提供了 50000+ 行示例代码,所以艿艿默认注释了所有 Maven Module。 胖友可以根据自己的需要,修改 pom.xml 即可。 一个涵盖六个主流技术栈的正经仓库: 《Spring Boot 专栏》 《Spring Cloud Alibaba 专栏》 《Spring Clou

芋道源码 9.7k Mar 14, 2021
shiro-cve-2020-17523 漏洞的两种绕过姿势分析(带漏洞环境)

Apache Shiro 两种姿势绕过认证分析(CVE-2020-17523) 0x01 漏洞描述 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和

null 62 Mar 24, 2021
提供一套基于Spring Boot-Shiro-Vue的权限管理思路.前后端都加以控制,做到按钮/接口级别的权限

Spring Boot-Shiro-Vue 提供一套基于SpringBoot-shiro-vue的权限管理思路. 前后端都加以控制,做到按钮/接口级别的权限 DEMO 测试地址 admin/123456 管理员身份登录,可以新增用户,角色. 角色可以分配权限 控制菜单是否显示,新增/删除按钮是否显示

null 3.6k May 8, 2021
循序渐进,学习Spring Boot、Spring Boot & Shiro、Spring Batch、Spring Cloud、Spring Cloud Alibaba、Spring Security & Spring Security OAuth2,博客Spring系列源码:https://mrbird.cc

Spring 系列教程 该仓库为个人博客https://mrbird.cc中Spring系列源码,包含Spring Boot、Spring Boot & Shiro、Spring Cloud,Spring Boot & Spring Security & Spring Security OAuth2

mrbird 18.8k Mar 14, 2021
Shiro基于SpringBoot +JWT搭建简单的restful服务

Shiro + JWT + Spring Boot Restful 简易教程 GitHub 项目地址:https://github.com/Smith-Cruise/Spring-Boot-Shiro 。 序言 我也是半路出家的人,如果大家有什么好的意见或批评,请务必 issue 下。 如果想要直接

Smith Cruise 1.5k Mar 12, 2021
:fire: Spring-Boot-Plus is a easy-to-use, high-speed, high-efficient,feature-rich, open source spring boot scaffolding. :rocket:

Everyone can develop projects independently, quickly and efficiently! What is spring-boot-plus? A easy-to-use, high-speed, high-efficient, feature-ric

geekidea 2.1k Apr 23, 2021
Spring Boot Resources

Awesome Spring Boot 收集各种 Spring Boot 学习资源 参与贡献 推荐程序员都关注的一个漫画公众号 关注后,回复:java 获取超过 10万 人领取的 Java 知识体系/面试必看资料。 目录 博客 网站 开源 其它 Spring Boot Starters 列表 博客

纯洁的微笑 3.7k May 2, 2021
spring boot 实践学习案例,是 spring boot 初学者及核心技术巩固的最佳实践。另外写博客,用 OpenWrite。

推荐工具: 微信公众号 Markdown 编辑器 - OpenWrite:Markdown 微信编辑器是一款专业强大的微信公众平台在线编辑排版工具,提供手机预览功能,让用户在微信图文 、文章、内容排版、文本编辑、素材编辑上更加方便。 - 更多介绍 博客群发平台 一、支持泥瓦匠 Spring Boot

泥瓦匠BYSocket 14.1k Mar 14, 2021
Spring Boot starter module for gRPC framework.

Spring Boot starter module for gRPC framework.

Michael Zhang 1.8k Mar 17, 2021
Spring Boot starter module for gRPC framework.

Spring Boot starter module for gRPC framework.

Michael Zhang 1.8k Mar 17, 2021
:herb: 基于springboot的快速学习示例,整合自己遇到的开源框架,如:rabbitmq(延迟队列)、Kafka、jpa、redies、oauth2、swagger、jsp、docker、spring-batch、异常处理、日志输出、多模块开发、多环境打包、缓存cache、爬虫、jwt、GraphQL、dubbo、zookeeper和Async等等:pushpin:

欢迎大家留言和PR~ Tip: 技术更新换代太快,本仓库仅做参考,自己的项目具体使用哪个版本还需谨慎思考~(不推荐使用最新的版本,推荐使用(最新-1|2)的版本,会比较稳定) spring-boot-quick 前言   自己很早就想搞一个总的仓库就是将自己平时遇到的和学习到的东西整合在一起,方便后

wangxc 1.6k Mar 8, 2021