需求剖析

按照面向工具的思想,我们至少该当有权限(Privilege)和用户(User)实体。
两个实体足够了吗?细想一下,如果我们有多个用户,多个用户也有多个权限,当要为用户授权的时候,这样子就会非常麻烦!
以是我们该当引入角色(Role)这个实体!

引入角色(Role)这个实体方便在哪呢??把权限赋给角色(比如:把删除、修正的权限给管理员这个角色),管理员这个角色再赋给用户,那么该用户就有了修正、删除的权限了!

权限和角色是多对多的关系,角色和用户也是多对多的关系!

javajsp权限控制JavaWeb基本权限治理体系修订版 Python

开拓实体

用户实体

角色实体

权限实体

改良

用户和角色、角色和权限都是多对多的关系,这是毋庸置疑的!
我们也按照面向工具的方法来设计,用凑集来记住另一方的数据!

但是呢,我们想想:

在权限的Dao中,在查看权限的时候,有必要列出相对应的角色吗??在角色的Dao中,在查看角色的时候,有必要列出相对应的用户吗??

答案是没有的,一样平常我们都不会显示出来。
以是,权限的实体没必要利用Set凑集来记住角色,角色实体没必要利用Set凑集来记住用户!

改良后的权限实体

改良后的角色实体

在数据库中建表

user表

role表

privilege表

user和role的关系表

role和privilege的关系表

把稳:user和role的关系表、role和privilege的关系都有role_id作为外键,外键的名称是不能一样的!

开拓DAO

PrivilegeDao

UserDao

RoleDao

补充

上面的仅仅是单表的Dao功能,User和Role表是多对多的关系,Role和Privilege表也是多对多的关系。

前面已经剖析了

在User工具中,须要一个Set凑集来记住Role的关系。
【显示用户的时候,该当把所有角色显示出来】在Role工具中,须要一个Set凑集来记住Privilege的关系【显示角色的时候,该当把所有权限显示很出来】。

以是该当在UserDao有获取某用户所有的角色的方法:

在RoleDao有获取所有权限的方法:

我们既然能获取得到用户所有的角色了,获取得到角色所有的权限了。
那自然我们就该当有修正用户的角色功能,修正角色的权限的功能啦!

我们先来剖析一下它怎么写:要修正用户所拥有的角色,该当知道修正用户是哪一个,以是须要用户的id或者User工具!
修正的角色是什么,须要Role工具或者装载Role工具的凑集!

在UserDao有修正某用户角色的方法,我们是想把所有的角色都删除了,再添加新的角色

在RoleDao有修正角色权限的方法,和上面是类似的。

更新

刚才又思考了一下:

实在我们并不须要在User类用利用凑集来掩护Role,在Role中利用凑集来掩护Privilege。
在原来的做法我们已经看到了,我们完备是不须要这两个变量也能完成效果的。
那么,现在问题就来了。
什么时候我们才须要在实体中利用变量来掩护多的一方的关系呢???我以为是这样的:当我们在查询一方数据的时候,另一方的数据也同时须要展示。
那么此时我们就该当利用凑集来掩护多的一方数据了。
基于上面一个例子,就比如:订单与订单项。
当我们查看订单的时候,同时一定会把所有的订单项都列举出来。
再比如:当我们查看购物车的时候,就须要把所有的购物项都列举出来。
而我们利用展示用户的时候,并不须要第一韶光就把角色列举出来,而是通过超链接来查看用户下的角色,基于这种情形,我以为我们是不用利用凑集变量来掩护多的一方的数据的。

这就跟Hibernate的

开拓BusinessService

UserService

RoleService

PrivilegeService

开拓Web

用户模块

添加用户

供应页面界面的Servlet

//直接跳转到显示添加用户的界面request.getRequestDispatcher(\公众/WEB-INF/jsp/addUser.jsp\"大众).forward(request, response);显示页面的JSP

处理表单数据的Servlet

显示用户

供应页面界面的Servlet

显示页面JSP

效果:

为用户添加角色

在显示用户的根本上,该当添加为用户授权角色的超链接。

效果:

处理显示授权页面的Servlet

授权页面JSP

效果:

处理表单数据并为用户添加角色的Servlet

角色模块

添加角色

供应添加角色页面的Servlet

显示页面JSP

处理表单数据并添加角色的Servlet

效果:

查看所有的角色

供应页面的Servlet

显示页面JSP

效果

为角色授权

与上面是类似的,我们要在查看角色的时候,添加授权的功能!

效果:

供应显示权利页面的Servlet

显示页面JSP

效果:

处理表单数据并添加角色权利的Servlet

效果:

权限模块

添加权限

供应添加权限页面的Servlet

//直接跳转到jsp页面request.getRequestDispatcher(\公众/WEB-INF/jsp/AddPrivilege.jsp\公众).forward(request, response);显示页面JSP

效果:

处理表单数据,并添加权限的Servlet

效果:

查看所有权限

供应页面的Servlet

//得到所有的权限PrivilegeService privilegeService = new PrivilegeService();List<Privilege> list = privilegeService.getAllPrivileges();request.setAttribute(\"大众list\公众, list);request.getRequestDispatcher(\"大众/WEB-INF/jsp/LookPrivileges.jsp\公众).forward(request, response);显示权限页面的JSP

效果:

用分帧把功能拼接

head页面

<body style=\"大众text-align: center\公众> <h1>XX管理系统</h1> </body>left页面

<body> <a href=\公众${pageContext.request.contextPath}/LookUserUI\公众 target=\"大众body\"大众>用户管理</a><br><br><br><br> <a href=\"大众${pageContext.request.contextPath}/LookRolesUI\公众 target=\"大众body\公众>角色管理</a><br><br><br><br> <a href=\"大众${pageContext.request.contextPath}/LookPrivileges\"大众 target=\"大众body\公众>权限管理</a><br><br><br><br></body>body页面是空缺的!
index页面:

<%@ page contentType=\"大众text/html;charset=UTF-8\"大众 language=\"大众java\"大众 %> <html> <head> <title>$Title$</title> </head> <frameset rows=\"大众25%,\"大众> <frame src=\"大众head.jsp\"大众 name=\公众head\公众> <frameset cols=\"大众15%,\公众> <frame src=\"大众left.jsp\公众 name=\"大众left\公众> <frame src=\公众body.jsp\公众 name=\"大众body\公众> </frameset> </frameset> </html>效果:过滤器

过滤器紧张的事情便是:点击超链接时,过滤器会检测该点击者是否有权限进入页面进行操作(CURD)。

这里写图片描述

这里我们是这样子做的:uri作为key,权限作为value,构成一个Map凑集。
当用户要求资源的时候,判断该资源是否须要权限,如果须要权限,就判断该用户是否上岸了,如果上岸了,就判断该用户有没有权限去访问该资源!

在UserDao和UserService中须要添加login方法:

补充的代码

上岸界面的JSP

处理上岸的Servlet

Filter代码

完全代码:

测试

总结要点

①:用户和权限的关系,由于添加用户的权限和修正用户权限的不敷【在权限很多的情形下,这种情形是不好处理的】,以是我们引入了角色这个观点

②:用户与角色,角色与权限都是多对多的关系

③:按照数据库范式,我们会创建5张实体表,个中两张是代表着:用户与角色、角色与权限的关系表。
角色这个字段在外键中,不能同名!

④:无论是角色、用户、权限都有这三个方法:得到所有的权限(角色、用户)、添加权限(角色、用户)、权限的id得到权限(角色、用户)工具

⑤:根据id得到详细的工具方法的意义:在web显示层只能通过id来标识着这个工具,然而在后端常常利用的是工具,于是就有了这个方法。

⑥:多对多之间的关系,在程序中并不是都要在其类上定义一个凑集来记住对方。
当显示用户时,须要显示角色,但是显示角色时,一样平常我们是不须要显示用户的信息的。
因此在角色上,并不须要掩护一个凑集来记住所有的用户

⑦:得到用户的所有角色:传入的参数必定有详细的用户或角色,以是id必须是外界通报进来的。
【得到角色的所有权限是同理】

⑧:修正用户的角色:我们先把用户的角色全部删除了,再通过外界勾选的角色进行添加(这是一个折中的办法)【修正角色的权限是同理】

⑨:在添加用户角色的时候,要把用户的id通过隐蔽域通报进去给做事器端,不然是不知道要修正的是哪一个用户的角色的。
【修正角色的权限是同理】

⑩:frameset和frame来实现前台的分帧,target指定在哪里显示详细的数据

①①:在init()方法中用一个Map凑集,以uri作为key,以详细的权限作为值来实现过滤

①②:如果uri不须要权限,直接放行。
须要权限,那么判断该用户是否登录了。
没有登录就让用户去登录

①③:如果登录了,就得到用户所有的权限,权限用一个Set凑集装载,遍历Set凑集,利用contains()方法就可以查看出有没有对应的权限了。

①④:利用contains()方法须要在权限类上重写hashCode()和equals()方法的。
由于我们比较的是字符串。

原文地址:https://dwz.cn/w9wgblEj作者:Java3y