Java权限管理(授权与认证)
CRM权限管理
有兴趣的同学也可以阅读我最近分享的:Shiro框架原理分析 (PS : 这篇博客里面介绍了使用Shiro框架的方式实现权限管理)
https://www.cnblogs.com/yly-blog/p/9837384.html
如果发现分享的内容有不合理或者的不对地方,请留言,我会及时定位分析,感谢!!!
一、概念
权限管理就是管理用户对于资源的操作。本 CRM 系统的权限(也称作资源)是基于角色操作权限来实现的,即RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间都是多对多的关系,为了实现表之间多对多的关系,必须将一个多对多的关系通过一个中间表分为两个一对多的关系。因此引入中间表,用户角色表和角色权限表。
二、数据库
权限管理模块一共涉及五张表:
- 三张主表
a) 用户表(t_user)、
b) 角色表(t_role)、
c) 资源表(t_module)、
2.两张中间表
a) 用户角色表(t_user_role)、
b) 角色—资源表(t_permission)、
三、权限管理实现
1、模块、角色、用户的单表CRUD
模块CRUD:操作t_module表
角色CRUD:操作t_role表
用户CRUD:操作t_role表
2、授权
角色赋予权限
给角色赋予权限:使用ztree进行权限树结构的构建
a)赋权限
1、先把本模块绑定;
2、绑定父模块;
3、绑定子模块
b)删权限
1、先删除本模块;
2、删除子模块;
3、删除父模块(判断父模块是否有其他的子模块关联词角色,如果没有就取消,如果有就关联)
a) 使用jQuery的插件zTree构建一个资源的树结构,树中的内容为表t_module中的数据
b) 用鼠标点击zTree中的选择框操作表t_permission(角色资源表)实现给角色赋予权限
用户赋予角色
给用户赋予角色:使用的combobox多选
a).添加账号:直接往t_user_role插入记录
b).修改账号:先删除,在添加
创建用户或者是修改用户信息时都可以通过combobox多选框给用户赋予角色操作t_user_role(用户角色表)
3、认证
思路:
从t_permission表中获取权限值(acl_value)与页面传来的值或者与注解中明确的权限值比较,下面提供两种思路:
1.页面传递过来Request.getParameter(“permission”);比对 根据userId查询数据库查到的权限列表 contains
2.通过注解明确模块权限值:@requirePermission(permission=”1010”;
后台认证:Spring AOP和自定义注解实现认证
获取用户权限存入session,然后用户操作资源时会提交一个资源的权限值,在判断用户是否包含有此权限
使用Spring AOP进行拦截认证
第一步:开启注解驱动<aop:aspectj-autoproxy />
第二步:创建一个代理类使用@Aspect @Component注解进行标记
第三步:定义一个切入点@Pointcut(" *execution('com.shsxt.controller.*.*((..))')")
public void pointcut() {}
第四步:编写一个增强:@Around(value="pointcut()")
1.判定用户是否登录
2.获取用户权限
3.将权限存入session--》给前端页面判断
4.后台的权限校验
5.返回
- 自定义注解
2.编写切面类
定义切入点point:自拦截有权限注解的方法,更能提升性能
//@Pointcut("execution(* com.shsxt.controller.*.*(..))") @Pointcut("@annotation(com.shsxt.annotation.RequirePermissions)") public void pointcut() { }
通过前台传递permission参数实现:
List<String> permissions = permissionService.findRolePermissions(roleIds.substring(0, roleIds.lastIndexOf(","))); String permissioFront = request.getParameter("permission"); // 后台权限认证 AssertUtil.isTrue(!permissions.contains(permissioFront), "您无权操作此模块");
通过注解实现
List<String> permissions = permissionService.findRolePermissions(roleIds.substring(0, roleIds.lastIndexOf(","))); if (requirePermissions != null) { String permission = requirePermissions.permission(); // 后台权限认证 throw new UnAuthPermissionException(permission, "您无权操作此模块"); }
3.引入AOP的namepsace并开启AOP注解驱动
<!-- 启用@Aspect注解 --> <aop:aspectj-autoproxy />
4.在需要权限认证的方法上启用注解
Permission应该和module表中的act_value保持一致
前台认证:Freemarker 内建函数判断
获取用户权限后在前端的freemarker中利用freemarker语法去判断用户是否能够操作此资源(list?seq_contains('权限值'))
1.SQL:
SELECT DISTINCT p.acl_value FROM t_permission p -- LEFT JOIN t_role r ON r.id = ur.role_id left JOIN t_user_role ur on p.role_id = ur.role_id WHERE ur.user_id = 10;
2.在AOP切面类中查询permission取出权限值列表、放入Session
3.前台页面判断: 解释:利用freemarker 内建函数sql_contains判断序列是否包含参数值,包含返回true
类似于java中集合hashmap.contains(value);
Java权限管理(授权与认证)的更多相关文章
- java权限管理与用户角色权限设计
java权限管理与用户角色权限设计 实现业务系统中的用户权限管理 B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端实现或通过客户端+服务器 ...
- Admin后台权限管理、三大认证
目录 APIView的请求生命周期 三大认证规则 权限六表 自定义User表 详细配置演示 models.py setting.py admin.py 使用过程: 控制填写信息的字段 控制添加权限 控 ...
- Java权限管理
基于角色的权限管理
- 权限管理学习 一、ASP.NET Forms身份认证
说明:本文示例使用的VS2017和MVC5. 系统无论大小.牛逼或屌丝,一般都离不开注册.登录.那么接下来我们就来分析下用户身份认证. 简单实现登录.注销 以前在学习.net的时候不知道什么Forms ...
- 【转】权限管理学习 一、ASP.NET Forms身份认证
[转]权限管理学习 一.ASP.NET Forms身份认证 说明:本文示例使用的VS2017和MVC5. 系统无论大小.牛逼或屌丝,一般都离不开注册.登录.那么接下来我们就来分析下用户身份认证. 简单 ...
- 【基于url权限管理 shiro(一)】--基础
只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源.权限管理包括用户认证和授权两部分. 用户认证 1.概 ...
- Shiro系列(1) - 权限管理的介绍与原理
1. 什么是权限管理 一般来说,只要有用户参与,那么该系统都会需要权限管理,权限管理实现了对用户访问系统 指定功能的限制,按照管理员定义的安全规则或权限策略,限制用户只能访问自己被授权的那些资源路径 ...
- Shiro基础学习(一)—权限管理
一.基本概念 1.权限管理 只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源. 权限管理 ...
- 【shiro】(1)---了解权限管理
了解权限管理 一.概念 1.什么是权限管理 只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源. 权限管理包 ...
随机推荐
- ExtJS 4 MVC 创建 Viewport
http://ext4all.com/post/extjs-4-mvc-with-viewport 效果图: 结构图: 没有用到Model层,直接在view里面写上 默认的 json的数据 中间Pan ...
- bzoj 3029: 守卫者的挑战【概率dp】
以后写dp还是向后转移吧--写的把前面加起来的版本怎么也调不过去 首先注意,因为地图碎片只占1体积,所以>n,<-n的体积是没用的,所以就可以把体积降到n级别,然后用这场胜负像后转移即可, ...
- 理解C++中拷贝构造函数
拷贝构造函数的功能是用一个已有的对象来初始化一个被创建的同样对象,是一种特殊的构造函数,具有一般构造函数的所有特性,当创建一个新对象的时候系统会自动调用它:其形参是本类对象的引用,它的特殊功能是将参数 ...
- Python学习规划
短时间踏实而高效的学习python 知乎:如何系统的学习python 简书:最全的python学习手册 目录 Python编程语言 python视频教程 Python神经网络算法与深度学习视频教程人工 ...
- 51nod 1874 字符串排序
1874 字符串排序 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 定义一个字符串的无序度为所有位置后面的字母比该位置的字母小的总数之和.比如&q ...
- 构造 Codeforces Round #310 (Div. 2) B. Case of Fake Numbers
题目传送门 /* 题意:n个数字转盘,刚开始每个转盘指向一个数字(0~n-1,逆时针排序),然后每一次转动,奇数的+1,偶数的-1,问多少次使第i个数字转盘指向i-1 构造:先求出使第1个指向0要多少 ...
- 字符串处理/贪心 Codeforces Round #307 (Div. 2) B. ZgukistringZ
题目传送门 /* 题意:任意排列第一个字符串,使得有最多的不覆盖a/b字符串出现 字符串处理/贪心:暴力找到最大能不覆盖的a字符串,然后在b字符串中动态得出最优解 恶心死我了,我最初想输出最多的a,再 ...
- CentOS安装GlassFish4.0 配置JDBC连接MySQL
转自:http://linux.it.net.cn/CentOS/course/2014/0724/3319.html 版本glassfish-4.0.zip 1.解压,拷贝到指定安装路径 unz ...
- Web自动化测试框架-PO模式
Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 一.适用范围:传统Web功能自动化测试.H5功能自动化测试 ...
- GUI初步和frame&panel
java的话这个GUI其实不是什么重点,但我们也要学习,重点是学习这种图形编程的思路. java里面对于图形的一些类都封装在了AWT和它的一些子包里.AWT(抽象窗口开发包) 当 ...