权限管理系统(一)

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

目的


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

10.jpg


需求分析


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

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

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



开发实体


用户实体


publicclassUser{


   privateStringid;

   privateStringusername;

   privateStringpassword;


   //记住角色

   privateSet<Role>roles=newHashSet<>();


   //各种getter和setter.....



}


角色实体


publicclassRole{

   privateStringid;

   privateStringname;

   privateStringdescription;


   //记住所有的用户

   privateSet<User>users=newHashSet<>();


   //记住所有的权限

   privateSet<Privilege>privileges=newHashSet<>();


   //各种getter和setter.....

}


权限实体


publicclassPrivilege{


   privateStringid;

   privateStringname;

   privateStringdescription;


   //记住所有的角色

   privateSet<Role>roles=newHashSet<>();


   //各种getter和setter.....


}


改良


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

但是呢,我们想想:

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

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


改良后的权限实体


publicclassPrivilege{


   privateStringid;

   privateStringname;

   privateStringdescription;


   //各种setter和getter方法

   

}


改良后的角色实体


publicclassRole{

   privateStringid;

   privateStringname;

   privateStringdescription;

   

   //记住所有的权限

   privateSet<Privilege>privileges=newHashSet<>();


   //各种setter和getter方法



}



在数据库中建表


user表


CREATETABLEuser(

     id       VARCHAR(20)PRIMARYKEY,

     usernameVARCHAR(20)NOTNULL,

     passwordVARCHAR(20)NOTNULL

   

   

   );


role表


CREATETABLErole(

     id          VARCHAR(20)PRIMARYKEY,

     name        VARCHAR(20)NOTNULL,

     descriptionVARCHAR(255)

   

   );


privilege表


CREATETABLEprivilege(

   

     id          VARCHAR(20)PRIMARYKEY,

     name        VARCHAR(20)NOTNULL,

     descriptionVARCHAR(255)

   

   

   );


user和role的关系表


CREATETABLEuser_role(

   

     user_idVARCHAR(20),

     role_idVARCHAR(20),

     PRIMARYKEY(user_id,role_id),

     CONSTRAINTuser_id_FKFOREIGNKEY(user_id)REFERENCESuser(id),

     CONSTRAINTrole_id_FKFOREIGNKEY(role_id)REFERENCESrole(id)

   );


role和privilege的关系表


CREATETABLErole_privilege(

   

     role_id      VARCHAR(20),

     privilege_idVARCHAR(20),

     PRIMARYKEY(role_id,privilege_id),

   

     CONSTRAINTrole_id_FK1FOREIGNKEY(role_id)REFERENCESrole(id),

     CONSTRAINTprivilege_id_FKFOREIGNKEY(privilege_id)REFERENCESprivilege(id)

   

   );

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



开发DAO


PrivilegeDao


/**

* 权限的管理应该有以下的功能:

* 1.添加权限

* 2.查看所有权限

* 3.查找某个权限

*

* */

publicclassPrivilegeDao{


   /*添加权限*/

   publicvoidaddPrivilege(Privilegeprivilege){

       try{


           QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());

           Stringsql="INSERT INTO privilege (id, name, description) VALUE (?, ?, ?)";

           queryRunner.update(sql,newObject[]{privilege.getId(),privilege.getName(),privilege.getDescription()});



       }catch(Exceptione){

           e.printStackTrace();

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

       }

   }


   /*查找权限*/

   publicPrivilegefindPrivilege(Stringid){


       try{


           QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());

           Stringsql="SELECT *FROM privilege WHERE id = ?";

           Privilegeprivilege=(Privilege)queryRunner.query(sql,newBeanHandler(Privilege.class),newObject[]{id});


           returnprivilege;

       }catch(Exceptione){

           e.printStackTrace();

           thrownewRuntimeException("查找权限失败了!");

       }

   }


   /*获取所有的权限*/

   publicList<Privilege>getAllPrivileges(){


       try{


           QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());

           Stringsql="SELECT * FROM privilege ";


           List<Privilege>privileges=(List<Privilege>)queryRunner.query(sql,newBeanListHandler(Privilege.class));

           

           returnprivileges;


       }catch(Exceptione){

           e.printStackTrace();

           thrownewRuntimeException("查找权限失败了!");

       }

   }

}


测试PrivilegeDao的功能


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

publicclassPrivilegeDaoTest{

   

       PrivilegeDaoprivilegeDao=newPrivilegeDao();

   

       @Test

       publicvoidadd(){

   

           Privilegeprivilege=newPrivilege("2","修改","修改功能");

   

           privilegeDao.addPrivilege(privilege);

   

       }

   

       @Test

       publicvoidgetAll(){

           List<Privilege>list=privilegeDao.getAllPrivileges();

   

           for(Privilegeprivilege:list){

   

               System.out.println(privilege.getId());

           }

       }

   

       @Test

       publicvoidfind(){

           Stringid="2";

   

           Privilegeprivilege=privilegeDao.findPrivilege(id);

   

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

   

       }

}


UserDao


publicclassUserDao{


   publicvoidaddUser(Useruser){


       try{


           QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());

           Stringsql="INSERT INTO user (id,username,password) VALUES(?,?,?)";


           queryRunner.update(sql,newObject[]{user.getId(),user.getUsername(),user.getPassword()});



       }catch(Exceptione){

           e.printStackTrace();

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

       }


   }


   publicUserfind(Stringid){

       try{


           QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());


           Stringsql="SELECT * FROM user WHERE id=?";

           Useruser=(User)queryRunner.query(sql,newBeanHandler(User.class),newObject[]{id});


           returnuser;


       }catch(Exceptione){

           e.printStackTrace();

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

       }


   }


   publicList<User>getAll(){

       try{


           QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());


           Stringsql="SELECT * FORM user";

           List<User>users=(List<User>)queryRunner.query(sql,newBeanListHandler(User.class));


           returnusers;

       }catch(Exceptione){

           e.printStackTrace();

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

       }

   }

}


測試UserDao


publicclassUserDaoTest{


   UserDaouserDao=newUserDao();


   @Test

   publicvoidadd(){


       Useruser=newUser();

       user.setId("2");

       user.setUsername("qqq");

       user.setPassword("123");

       userDao.addUser(user);



   }


   @Test

   publicvoidfind(){


       Stringid="1";

       Useruser=userDao.find(id);


       System.out.println(user.getUsername());

   }


   @Test

   publicvoidfindALL(){


       List<User>userList=userDao.getAll();


       for(Useruser:userList){


           System.out.println(user.getUsername());

       }


   }


}


RoleDao


publicvoidadd(Rolerole){


       try{

           QueryRunnerrunner=newQueryRunner(JdbcUtils.getDataSource());

           Stringsql="insert into role(id,name,description) values(?,?,?)";

           Objectparams[]={role.getId(),role.getName(),role.getDescription()};

           runner.update(sql,params);

       }catch(Exceptione){

           thrownewRuntimeException(e);

       }


   }


   publicRolefind(Stringid){


       try{

           QueryRunnerrunner=newQueryRunner(JdbcUtils.getDataSource());

           Stringsql="select * from role where id=?";

           return(Role)runner.query(sql,id,newBeanHandler(Role.class));

       }catch(Exceptione){

           thrownewRuntimeException(e);

       }

   }


   //得到所有角色

   publicList<Role>getAll(){

       try{


           QueryRunnerrunner=newQueryRunner(JdbcUtils.getDataSource());

           Stringsql="select * from role";

           return(List<Role>)runner.query(sql,newBeanListHandler(Role.class));

       }catch(Exceptione){

           thrownewRuntimeException(e);

       }


   }




目录
相关文章
|
14天前
|
Linux 数据安全/隐私保护
权限管理
inux权限管理是一种控制用户和程序对文件和文件夹的访问的方法。它使用三个主要的概念:所有者(owner)、群组(group)和其他(others)。 每个文件和文件夹都有一个所有者,这是创建该文件或文件夹的用户。所有者拥有最高的权限,可以对文件和文件夹进行更改、读取和删除。群组是一组用户,他们可以共享文件和文件夹的权限。其他用户是除所有者和群组以外的其他用户。 Linux使用三个主要的权限:读、写和执行。读权限允许用户查看文件或文件夹的内容,写权限允许用户更改文件或文件夹的内容,执行权限允许用户运行文件或文件夹中的程序。是一种控制用户和程序对文件和文件夹的访问的方法。它使用三个主要的概念:所
12 2
|
1月前
|
Linux 数据安全/隐私保护
权限管理权限管理
inux权限管理是一种控制用户和程序对文件和文件夹的访问的方法。它使用三个主要的概念:所有者(owner)、群组(group)和其他(others)。 每个文件和文件夹都有一个所有者,这是创建该文件或文件夹的用户。所有者拥有最高的权限,可以对文件和文件夹进行更改、读取和删除。群组是一组用户,他们可以共享文件和文件夹的权限。其他用户是除所有者和群组以外的其他用户。 Linux使用三个主要的权限:读、写和执行。读权限允许用户查看文件或文件夹的内容,写权限允许用户更改文件或文件夹的内容,执行权限允许用户运行文件或文件夹中的程序。是一种控制用户和程序对文件和文件夹的访问的方法。它使用三个主要的概念:所
22 0
|
1月前
|
Linux 数据安全/隐私保护
vLinux权限管理
Linux权限管理是一种控制用户和程序对文件和文件夹的访问的方法。它使用三个主要的概念:所有者(owner)、群组(group)和其他(others)。 每个文件和文件夹都有一个所有者,这是创建该文件或文件夹的用户。所有者拥有最高的权限,可以对文件和文件夹进行更改、读取和删除。群组是一组用户,他们可以共享文件和文件夹的权限。其他用户是除所有者和群组以外的其他用户。 Linux使用三个主要的权限:读、写和执行。读权限允许用户查看文件或文件夹的内容,写权限允许用户更改文件或文件夹的内容,执行权限允许用户运行文件或文件夹中的程序。是一种控制用户和程序对文件和文件夹的访问的方法。它使用三个主要的概念:
14 0
|
SQL 安全 关系型数据库
第03章 用户与权限管理
第03章 用户与权限管理
85 0
|
存储 设计模式 缓存
权限管理系统,可以这么设计
权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少。对权限做管理的系统,就是权限管理系统。
|
SQL Java 数据库
权限管理系统(四)
前面我们做的小项目都是一个表的,业务代码也相对简单。现在我们来做一个权限管理系统,体验一下多表的业务逻辑,顺便巩固一下过滤器的知识。!
481 2
权限管理系统(四)
|
11月前
|
前端开发 NoSQL 数据库
Vue3 + Nest 实现权限管理系统 后端篇(三):基于RBAC 权限控制实现
RBAC(Role Based Access Control)是基于角色的权限控制,简单来说就是给用户赋予一些角色,那么该用户就会拥有这些角色的所有权限。接下来我们就用 NestJS 来实现基于 RBAC 的权限控制
342 0
Vue3 + Nest 实现权限管理系统 后端篇(三):基于RBAC 权限控制实现
|
存储 前端开发 数据安全/隐私保护
权限管理需要哪几张表
一个成熟的系统系统是离不开权限管理的,说权限管理就必须要说下权限管理经典的五张表了,无论是自定义的权限管理框架,还是流行的Shiro、SpringSecurity等权限管理框架都是离不开这五张表的,哪五张表呢,一起看下。
438 0
|
SQL Java 数据库连接
权限管理系统(二)
前面我们做的小项目都是一个表的,业务代码也相对简单。现在我们来做一个权限管理系统,体验一下多表的业务逻辑,顺便巩固一下过滤器的知识。!
270 0
权限管理系统(二)
|
Java 数据安全/隐私保护
权限管理系统(三)
前面我们做的小项目都是一个表的,业务代码也相对简单。现在我们来做一个权限管理系统,体验一下多表的业务逻辑,顺便巩固一下过滤器的知识。!
202 0
权限管理系统(三)