java管理员模块设计_通俗易懂权限管理模块设计 - Java

最近一直在做CMS系统,发现一些内容其实都是重复出现的,例如权限管理模块。权限管理模块就是为了管理用户是否有权利访问某个权限,如果不能则拒绝访问。其实Java中已经有很成熟的权限管理框架,例如

Shiro,spring Security等,也推荐大家使用。但是一些设计上的东西还是要重复再造过轮子才能发现里面的精髓,所以这份代码,供不太明白的同学也参考参考。

代码分享在 Github 上,欢迎大家指出问题: github.com/yixiaoming/…

下面我将详细介绍一下这个简单的权限管理模块,以便大家可以拿去直接使用。

数据表

811c9bb9dec8bc4d3c87eff0574d35df.png

主要三张表

t_user:用户表,访问系统的对象

t_permission:权限表,每条记录就是一个权限,也就是一个 url 地址

t_group:用户组表,一个组可以包含多个权限,用户如果在这个组中,则享有所有权限

简单例子

来个简单的例子,例如一个CMS系统中,有一些权限:添加文章( /admin/article/add),查看文章( /admin/article/{id}),删除文章( /admin/delete/{id}),修改文章( /admin/article/update/{id}),每个权限其实对应一个controller的 requet 地址。这些内容存放在 t_permission 中。

然后系统中有一些用户都放在 t_user中,然后我可以为 每个user 分配一些权限,一个user叫 张三,我可以给他直接添加权限:查看文章。那么他只能查看,不能增删改。

然后用户组表可以看作一个部门,例如一个用户组叫:文章管理组,那么这个组可以添加:文章的增删改查4项权限。现在我再将 user分配到 文章管理组 中,那么张三就拥有了 文章的增删改查的所有权限。

最主要的思想就是:用户的权限,可以直接分配,也可以通过用户组来分配,用户的所有权限就是两者的并集

框架

Spring 4.26

Hibernate 5.10

Java 8

例子采用 SpringMVC + hibernate + Bootstrap搭建,简单实用,对于小项目使用绝对没有问题。

然后里面也用到了一些开源的Web前端项目,例如SB-Admin,Bootstrap

Multiselect,MetisMenu,Bootstrap Validation等,由于我本来不是做前端的,所以UI上的东西只能借助开源项目来完成。下面展示一下效果:

登陆页

c84e47a8a1bf51871bc084672fa71a71.png

用户列表页,用户组列表页,权限列表页 都类似

98eee59a15d1a75e328b7935f2964dfe.png

用户添加,修改页:

dcbd119e08c839cd43dc15a747931dff.png

选择权限

ad51f3c26f73e39ae9d34bd3b01270b8.png

选择用户组

17479b0c61f9c5746eb743b33c434bd0.png

当选定了权限和用户组,那么用户的权限就是 权限+角色组所有的权限 的并集。

登陆成功后将所有权限放在session中:

LoginController List permissions = userService.listUserPermissions(user.getId());

List gids = userService.listUserGids(user.getId());

List groupPermissions = groupService.listGroupsPermissions(ListUtil.list2array(gids));

for (Permission p : groupPermissions) {

if (!permissions.contains(p)) {

permissions.add(p);

}

}

request.getSession().setAttribute(Constant.LOGIN_USER, user);

request.getSession().setAttribute(Constant.LOGIN_PERMISSIONS, permissions);复制代码

然后写两个个拦截器,一个判断登录,一个判断权限,每次访问链接前先判断是否有这个权限,如果没有则抛出异常。这里有一点还需要注意,如果用户的类型使 Admin 的话,那么默认就拥有所有权限,所以不需要验证。通过 user 的 isAdmin 字段判断

LoginInterceptor public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {

User user = (User) request.getSession().getAttribute(Constant.LOGIN_USER);

if (request.getRequestURL().toString().contains("/admin")) {

if (user == null) {

response.sendRedirect(request.getContextPath() + "/login");

return false;

}

}

return true;

}复制代码

PermissionInterceptor public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {

String url = request.getRequestURL().toString();

if (url.contains("/admin")) {

List permissions = (List) request.getSession().getAttribute(Constant.LOGIN_PERMISSIONS);

User user = (User) request.getSession().getAttribute(Constant.LOGIN_USER);

if (permissions == null || user == null) {

response.sendRedirect(request.getContextPath() + "/login");

return false;

}

// 如果是admin,就不需要权限验证

if (user.getAdmin()) {

return true;

}

boolean hasPermission = false;

for (Permission permission : permissions) {

if (url.contains(permission.getUrl())) {

hasPermission = true;

break;

}

}

if (!hasPermission) {

throw new CmsException("没有权限访问:" + url);

}

}

return true;

}复制代码

总结

这里洋洋洒洒的写了一些权限模块中的内容,只是里面的主线,细节的代码大家可以参考Github上的代码地址链接,大神略过。希望能给正在学习这个内容的同学一点帮助,反正造这个轮子,我学到了不少。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode MySQL 1527. Patients With a Condition(like)

文章目录1. 题目2. 解题1. 题目 Table: Patients ----------------------- | Column Name | Type | ----------------------- | patient_id | int | | patient_name | varchar | | conditions | varchar | ----------------------- patient_id is the primary ke…

LeetCode MySQL 550. 游戏玩法分析 IV

文章目录1. 题目2. 解题1. 题目 Table: Activity ----------------------- | Column Name | Type | ----------------------- | player_id | int | | device_id | int | | event_date | date | | games_played | int | ----------------------- &…

LeetCode MySQL 574. 当选者

文章目录1. 题目2. 解题1. 题目 表: Candidate -------------- | id | Name | -------------- | 1 | A | | 2 | B | | 3 | C | | 4 | D | | 5 | E | -------------- 表: Vote ------------------- | id | CandidateId | ---…

Win8下右键“发送到”没有蓝牙选项的解决办法

1.打开C:\Windows\System32,搜索fsquirt.exe,这时会得到多个搜索结果,选择路径是C:\Windows\System32的那个,其他的也可以,只不过是英文罢了。 2.在fsquirt.exe上右键-》创建快捷方式,因为无法在当前位置创…

LeetCode MySQL 534. 游戏玩法分析 III

文章目录1. 题目2. 解题1. 题目 Table: Activity ----------------------- | Column Name | Type | ----------------------- | player_id | int | | device_id | int | | event_date | date | | games_played | int | ----------------------- &…

LeetCode 1500. Design a File Sharing System(哈希map+优先队列)

文章目录1. 题目2. 解题1. 题目 We will use a file-sharing system to share a very large file which consists of m small chunks with IDs from 1 to m. When users join the system, the system should assign a unique ID to them. The unique ID should be used once …

mupdf java_mupdf库学习

http://macleo.iteye.com/blog/1544948Java代码freetye-config --cflags2.C语言的用处其实还是很大的....C也一样,不经意处C语言还在发挥着巨大的作用3.踏破铁鞋无觅处啊http://zhiweiofli.iteye.com/blog/9050694.Bitmap旋转http://blog.sina.com.cn/s/blog_625def…

LeetCode 425. 单词方块(Trie树+DFS)

文章目录1. 题目2. 解题1. 题目 给定一个单词集合 &#xff08;没有重复&#xff09;&#xff0c;找出其中所有的 单词方块 。 一个单词序列形成了一个有效的单词方块的意思是指从第 k 行和第 k 列 (0 ≤ k < max(行数, 列数)) 来看都是相同的字符串。 例如&#xff0c;单…

LeetCode 642. 设计搜索自动补全系统(Trie树)

文章目录1. 题目2. 解题1. 题目 为搜索引擎设计一个搜索自动补全系统。 用户会输入一条语句&#xff08;最少包含一个字母&#xff0c;以特殊字符 ‘#’ 结尾&#xff09;。 除 ‘#’ 以外用户输入的每个字符&#xff0c;返回历史中热度前三并以当前输入部分为前缀的句子。下面…

python 动漫卡通人物图片大全_用Python把人物头像动漫化,不同的表情给你不同的惊喜...

前言最近上网冲浪的时候看到了一个有趣的东西&#xff0c;叫做『人物动漫化』&#xff0c;作为老大的粉丝&#xff0c;怎么可能放过这个机会&#xff0c;让我们先看看效果图&#xff1a;这就是这次要用Python搞的事情啦&#xff0c;我们会利用百度AI的人物动漫化技术&#xff0…

LeetCode MySQL 1264. 页面推荐(union)

文章目录1. 题目2. 解题1. 题目 朋友关系列表&#xff1a; Friendship ------------------------ | Column Name | Type | ------------------------ | user1_id | int | | user2_id | int | ------------------------ 这张表的主键是 (user1_id, use…

LeetCode MySQL 1070. 产品销售分析 III(group by 陷阱)

文章目录1. 题目2. 解题1. 题目 销售表 Sales&#xff1a; -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | -------------…

LeetCode MySQL 1364. 顾客的可信联系人数量

文章目录1. 题目2. 解题1. 题目 顾客表&#xff1a;Customers ------------------------ | Column Name | Type | ------------------------ | customer_id | int | | customer_name | varchar | | email | varchar | ------------------------ customer_…

LeetCode MySQL 602. 好友申请 II :谁有最多的好友(union all)

文章目录1. 题目2. 解题1. 题目 在 Facebook 或者 Twitter 这样的社交应用中&#xff0c;人们经常会发好友申请也会收到其他人的好友申请。 表 request_accepted 存储了所有好友申请通过的数据记录&#xff0c;其中&#xff0c; requester_id 和 accepter_id 都是用户的编号。…

linux java 共享内存_Linux进程间通信之共享内存

一&#xff0c;共享内存内核管理一片物理内存&#xff0c;允许不同的进程同时映射&#xff0c;多个进程可以映射同一块内存&#xff0c;被多个进程同时映射的物理内存&#xff0c;即共享内存。映射物理内存叫挂接&#xff0c;用完以后解除映射叫脱接。1&#xff0c;共享内存的特…

LeetCode MySQL 1193. 每月交易 I(date_format)

文章目录1. 题目2. 解题1. 题目 Table: Transactions ------------------------ | Column Name | Type | ------------------------ | id | int | | country | varchar | | state | enum | | amount | int | | trans_date …

LeetCode 1257. 最小公共区域(最小公共祖先)

文章目录1. 题目2. 解题1. 题目 给你一些区域列表 regions &#xff0c;每个列表的第一个区域都包含这个列表内所有其他区域。 很自然地&#xff0c;如果区域 X 包含区域 Y &#xff0c;那么区域 X 比区域 Y 大。 给定两个区域 region1 和 region2 &#xff0c;找到同时包含…

创建样式和样式表

css中的样式&#xff08;或者规则&#xff09;由两部分组成&#xff1a;选择器和声明块。每个声明块里面可以包含多条声明&#xff0c;它们之间由分号分隔。如下图所示&#xff1a; 链接外部样式表 外部样式表可以使网页打开的速度更快。但是浏览器在下载外部样式表的时候&…

java 程序输出 赵_编写一个完整的JAVA的程序

编写一个完整的JAVA的程序关注:84 答案:1 mip版解决时间 2021-02-05 08:43提问者妳螚鬧俄螚笑2021-02-05 02:591&#xff0c;接口Person Show()方法输出对象的描述信息。2.类Student 实现Person接口&#xff0c;另有以下属性和方法:属性(私有)String name。方法Student():构造…

LeetCode 1229. 安排会议日程(双指针)

文章目录1. 题目2. 解题1. 题目 你是一名行政助理&#xff0c;手里有两位客户的空闲时间表&#xff1a;slots1 和 slots2&#xff0c;以及会议的预计持续时间 duration&#xff0c;请你为他们安排合适的会议时间。 「会议时间」是两位客户都有空参加&#xff0c;并且持续时间…