权限管理系统(二)

简介: 前面我们做的小项目都是一个表的,业务代码也相对简单。现在我们来做一个权限管理系统,体验一下多表的业务逻辑,顺便巩固一下过滤器的知识。!

测试RoleDao


RoleDaoroleDao=newRoleDao();


   @Test

   publicvoidadd(){


       Rolerole=newRole();

       role.setId("1");

       role.setName("manager");

       role.setDescription("this is a manager");


       roleDao.add(role);

   }

   @Test

   publicvoidfind(){


       Stringid="1";

       Rolerole=roleDao.find(id);


       System.out.println(role.getName());


   }


   @Test

   publicvoidgetAdd(){


       List<Role>roleList=roleDao.getAll();


       for(Rolerole:roleList){


           System.out.println(role.getName());

       }

   }


补充


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

前面已经分析了

  • 在User对象中,需要一个Set集合来记住Role的关系。【显示用户的时候,应该把所有角色显示出来】
  • 在Role对象中,需要一个Set集合来记住Privilege的关系【显示角色的时候,应该把所有权限显示很出来】。

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

/*得到用戶的所有角色*/

   publicList<Role>getRoles(Stringuser_id){


       try{


           QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());


           //根據用戶id查詢所有角色,重點就在角色上,所以要有role表。然后查詢user_role表,就可以鎖定用戶id對應的角色了!

           Stringsql="SELECT r.* FROM role r, user_role ur WHERE ur.user_id = ? AND r.id = ur.role_id ";


           List<Role>roles=(List<Role>)queryRunner.query(sql,newBeanListHandler(Role.class),newObject[]{user_id});


           returnroles;

       }catch(Exceptione){


           e.printStackTrace();

           thrownewRuntimeException("得到用戶所有的角色失败了!");

       }


   }


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


//得到某角色的所有權限【權限表、權限和角色關系表】

   publicList<Privilege>getPrivileges(Stringrole_id){

       try{


           QueryRunnerrunner=newQueryRunner(JdbcUtils.getDataSource());


           Stringsql="SELECT p.* FROM privilege p, role_privilege rp WHERE rp.role_id = ? AND p.id = rp.role_id";


           List<Privilege>privileges=(List<Privilege>)runner.query(sql,newBeanListHandler(Privilege.class),newObject[]{role_id});


           returnprivileges;



       }catch(Exceptione){

           thrownewRuntimeException(e);

       }

   }


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

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

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

//更新用戶的角色

   publicvoidupdateRole(Useruser,List<Role>roles){


       try{


           QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());


           //先把用戶原來的所有角色刪掉了

           Stringdelete="DELETE FROM user_role WHERE user_id = ?";

           queryRunner.update(delete,user.getId());



           Stringadd="INSERT INTO user_role (user_id,role_id) VALUES(?,?)";

           for(Rolerole:roles){

               queryRunner.update(add,newObject[]{user.getId(),role.getId()});

           }


       }catch(Exceptione){


           e.printStackTrace();

           thrownewRuntimeException("添加权限失败了!");

       }

       

   }


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

//为某个角色授权

   publicvoidaddPrivilege2Role(Rolerole,List<Privilege>privileges){


       try{

           QueryRunnerrunner=newQueryRunner(JdbcUtils.getDataSource());



           //先刪除該角色的所有權限

           Stringdelete="DELETE FROM role_privilege WHERE role_id = ?";

           runner.update(delete,newObject[]{role.getId()});


           //賦予角色新的權限

           Stringsql="INSERT INTO role_privilege (role_id, privilege_id) VALUES (?, ?)";

           for(Privilegeprivilege:privileges){

               runner.update(sql,newObject[]{role.getId(),privilege.getId()});

           }

       }catch(Exceptione){

           thrownewRuntimeException(e);

       }

   }


更新


刚才又思考了一下:

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

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

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



开发BusinessService


UserService


publicclassUserService{

   

   

       UserDaouserDao=newUserDao();

   

       //添加用户

       publicvoidaddUser(Useruser){

   

           userDao.addUser(user);

       }

   

       //根据id查找用户

       publicUserfindUser(Stringid){

           returnuserDao.find(id);

       }

   

       //得到所有的用户

       publicList<User>getAllUser(){

           returnuserDao.getAll();

       }

   

       //获取用户所有的角色

       publicList<Role>getUserRole(Stringuser_id){

           returnuserDao.getRoles(user_id);

       }

   

       //修改用户的角色

       publicvoidupdateUserRole(Useruser,List<Role>roles){

   

           userDao.updateRole(user,roles);

       }

   

   }


RoleService


publicclassRoleService{

   

       RoleDaoroleDao=newRoleDao();

   

       //添加角色

       publicvoidaddRole(Rolerole){

   

           roleDao.add(role);

       }

   

       //根据id查找角色

       publicRolefindRole(Stringid){

           returnroleDao.find(id);

       }

   

       //获取所有的角色

       publicList<Role>getAllRole(){

           returnroleDao.getAll();

       }

   

       //获取角色所有的权限

       publicList<Privilege>getRolePrivilege(Stringrole_id){

           returnroleDao.getPrivileges(role_id);

       }

   

       //修改角色的权限

       publicvoidupdateRolePrivilege(Rolerole,List<Privilege>privileges){

           roleDao.addPrivilege2Role(role,privileges);

       }

   }


PrivilegeService


publicclassPrivilegeService{

   

       PrivilegeDaoprivilegeDao=newPrivilegeDao();

   

   

       //添加权限

       publicvoidaddPrivilege(Privilegeprivilege){

           privilegeDao.addPrivilege(privilege);

       }

   

       //根据id获得权限

       publicPrivilegefindPrivilege(Stringid){

           returnprivilegeDao.findPrivilege(id);

       }

   

       //获取所有的权限

       publicList<Privilege>getAllPrivileges(){

           returnprivilegeDao.getAllPrivileges();

       }

   }


开发Web


用户模块


添加用户

  • 提供页面界面的Servlet

//直接跳转到显示添加用户的界面

       request.getRequestDispatcher("/WEB-INF/jsp/addUser.jsp").forward(request,response);

  • 显示页面的JSP

<formaction="AddUserController"method="post">

       <table>

           <tr>

               <td>用户名:</td>

               <td><inputtype="text"name="username"></td>

           </tr>

           <tr>

               <td>密码:</td>

               <td><inputtype="password"name="password"></td>

           </tr>

           <tr>

               <td><inputtype="submit"value="添加用户"></td>

               <td><inputtype="reset"value="重置"></td>

           </tr>

       </table>

   </form>

  • 处理表单数据的Servlet

//得到客户端传递进来的参数

       Stringusername=request.getParameter("username");

       Stringpassword=request.getParameter("password");


       Useruser=newUser();

       user.setId(WebUtils.makeId());

       user.setUsername(username);

       user.setPassword(password);


       try{

           UserServiceuserService=newUserService();

           userService.addUser(user);


           request.setAttribute("message","添加用户成功!");


       }catch(Exceptione){

           request.setAttribute("message","添加用户失败!");

           thrownewRuntimeException("在Controller添加客户失败");

       }

       request.getRequestDispatcher("/message.jsp").forward(request,response);

       

   }


显示用户


  • 提供页面界面的Servlet

UserServiceuserService=newUserService();

       List<User>list=userService.getAllUser();

       request.setAttribute("list",list);


       //跳转到显示页面

       request.getRequestDispatcher("/WEB-INF/jsp/LookUser.jsp").forward(request,response);

  • 显示页面JSP

<c:iftest="${empty(list)}">

   对不起,暂时没有任何客户

</c:if>


<c:iftest="${!empty(list)}">

   <tableborder="1px">

       <tr>

           <td>用户名</td>

           <td>密码</td>

       </tr>

       <c:forEachitems="${list}"var="user">

           <tr>

               <td>${user.username}</td>

               <td>${user.password}</td>

           </tr>

       </c:forEach>

   </table>


</c:if>

  • 效果:

11.jpg


目录
相关文章
|
11天前
|
安全 数据安全/隐私保护
什么是权限管理
什么是权限管理
20 0
什么是权限管理
|
4月前
|
Kubernetes 安全 数据安全/隐私保护
k8s-权限管理
k8s-权限管理
40 1
|
6月前
|
数据安全/隐私保护
权限管理
权限管理
34 1
|
数据安全/隐私保护
权限管理详解
权限管理详解
114 1
|
SQL 安全 关系型数据库
第03章 用户与权限管理
第03章 用户与权限管理
107 0
|
存储 设计模式 缓存
权限管理系统,可以这么设计
权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少。对权限做管理的系统,就是权限管理系统。
|
SQL Java 数据库
权限管理系统(四)
前面我们做的小项目都是一个表的,业务代码也相对简单。现在我们来做一个权限管理系统,体验一下多表的业务逻辑,顺便巩固一下过滤器的知识。!
511 2
权限管理系统(四)
|
PHP 数据库 数据安全/隐私保护
简单权限管理设计
这套权限管理是配合Zend Framework设计的,用在其他地方的时候可以做些修改。
简单权限管理设计
|
SQL 数据库 数据安全/隐私保护
权限管理系统(一)
前面我们做的小项目都是一个表的,业务代码也相对简单。现在我们来做一个权限管理系统,体验一下多表的业务逻辑,顺便巩固一下过滤器的知识。!
293 0
权限管理系统(一)
|
Java 数据安全/隐私保护
权限管理系统(三)
前面我们做的小项目都是一个表的,业务代码也相对简单。现在我们来做一个权限管理系统,体验一下多表的业务逻辑,顺便巩固一下过滤器的知识。!
221 0
权限管理系统(三)