欢迎光临建站系统网站,我们的服务范围是一键建站,公司建站等。

建站系统

一个高端新的网络集成营销平台

【JavaWeb】权限管理系统

作者:jcmp      发布时间:2021-04-25      浏览量:0
一、目的现在我有一个管理商品、订单的页面

一、目的

现在我有一个管理商品、订单的页面。当用户点击某个超链接时,过滤器会检测该用户是否有权限!

二、需求分析

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

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

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

三、开发实体

四、用户实体

五、角色实体

六、权限实体

七、改良

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

但是呢,我们想想:

答案是没有的,一般我们都不会显示出来。 所以,权限的实体没必要使用Set集合来记住角色,角色实体没必要使用Set集合来记住用户!

八、改良后的权限实体

九、改良后的角色实体

十、在数据库中建表

十一、user表

十二、role表

十三、privilege表

十四、user和role的关系表

十五、role和privilege的关系表

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

十六、开发DAO

十七、PrivilegeDao

十八、测试PrivilegeDao的功能

为了测试方便,添加有参构造函数到Privilege对象中

十九、UserDao

二十、測試UserDao

二十一、RoleDao

二十二、测试RoleDao

二十三、补充

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

前面已经分析了

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

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

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

我们先来分析一下它怎么写: 要修改用户所拥有的角色,应该知道修改用户是哪一个,所以需要用户的id或者User对象!修改的角色是什么,需要Role对象或者装载Role对象的集合!

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

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

二十四、更新

刚才又思考了一下:

这就跟Hibernate的懒加载差不多。用到关联关系的数据的时候才加载,没有用到的时候就先不查询数据库。

ps:我不知道在这我理解得对不对,如果有错的地方希望能指出!

二十五、开发BusinessService

二十六、UserService

二十七、RoleService

二十八、PrivilegeService

二十九、开发Web

三十、用户模块

三十一、添加用户

三十二、显示用户

三十三、为用户添加角色

在显示用户的基础上,应该添加为用户授权角色的超链接。

三十四、角色模块

三十五、添加角色

三十六、查看所有的角色

三十七、为角色授权

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

三十八、权限模块

三十九、添加权限

四十、查看所有权限

四十一、用分帧把功能拼接

四十二、过滤器

过滤器主要的工作就是: 点击超链接时,过滤器会检测该点击者是否有权限进入页面进行操作(CURD)。

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

四十三、补充的代码

四十四、Filter代码

四十五、测试

四十六、总结要点

①:用户和权限的关系,由于添加用户的权限和修改用户权限的不足【在权限很多的情况下,这种情况是不好处理的】,所以我们引入了角色这个概念。

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

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

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

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

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

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

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

⑨:在添加用户角色的时候,要把用户的id通过隐藏域传递进去给服务器端,不然是不知道要修改的是哪一个用户的角色的。【修改角色的权限是同理】

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

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

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

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

①④:使用contains()方法需要在权限类上重写hashCode()和equals()方法的。因为我们比较的是字符串。