需求剖析
按照面向工具的思想,我们至少该当有权限(Privilege)和用户(User)实体。两个实体足够了吗?细想一下,如果我们有多个用户,多个用户也有多个权限,当要为用户授权的时候,这样子就会非常麻烦!
以是我们该当引入角色(Role)这个实体!
引入角色(Role)这个实体方便在哪呢??把权限赋给角色(比如:把删除、修正的权限给管理员这个角色),管理员这个角色再赋给用户,那么该用户就有了修正、删除的权限了!
权限和角色是多对多的关系,角色和用户也是多对多的关系!
开拓实体
用户实体
角色实体
权限实体
改良
用户和角色、角色和权限都是多对多的关系,这是毋庸置疑的!
我们也按照面向工具的方法来设计,用凑集来记住另一方的数据!
但是呢,我们想想:
在权限的Dao中,在查看权限的时候,有必要列出相对应的角色吗??在角色的Dao中,在查看角色的时候,有必要列出相对应的用户吗??答案是没有的,一样平常我们都不会显示出来。以是,权限的实体没必要利用Set凑集来记住角色,角色实体没必要利用Set凑集来记住用户!
改良后的权限实体
改良后的角色实体在数据库中建表user表
role表
privilege表
user和role的关系表
role和privilege的关系表
把稳:user和role的关系表、role和privilege的关系都有role_id作为外键,外键的名称是不能一样的!
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凑集。当用户要求资源的时候,判断该资源是否须要权限,如果须要权限,就判断该用户是否上岸了,如果上岸了,就判断该用户有没有权限去访问该资源!
补充的代码
上岸界面的JSP
处理上岸的ServletFilter代码
完全代码:测试
总结要点
①:用户和权限的关系,由于添加用户的权限和修正用户权限的不敷【在权限很多的情形下,这种情形是不好处理的】,以是我们引入了角色这个观点
②:用户与角色,角色与权限都是多对多的关系
③:按照数据库范式,我们会创建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