角色与权限:多对多
一个角色可以有多个权限,一个权限可以被多个角色使用。
那我们下面就来使用我们完成的角色。
我们先来看一下需求,记不记得之前的用户编辑界面:
可以看到,我们注册用户的时候是要给用户安排一个角色的,而我们的角色在角色管理系统里面已经创建好了,可以从创建好的角色中挑选需要的角色(该角色拥有自己特有的权限)。
所以,我们说一下用户与角色的关系设计:
用户:用户1,用户2
角色:管理员,一般用户
用户与角色的关系:多对多
一个用户可以有多个角色;一个角色可以被多个用户使用
用户:user
用户id,名称...
1 用户1
2 用户2
用户角色:user_role
用户id,角色id
1 1
1 2
2 2
角色:role
角色Id,名称
1 管理员
2 一般用户
总体就是:
查询出用户后;需要知道这个用户有哪些角色
我们下面来实现它。实现它就是改造之前的用户管理模块.我们刚刚设计过,“用户”表和“角色”表我们之前都有的,这里不能动,我们需要做的就是设计编写出“用户与角色”这张中间表:
UserRole.java:
联合主键类(需要实现Serializable接口和改写equals和hashCode方法)
UserRoleId.java:
然后写我们的映射文件:
UserRole.hbm.xml
按理来说接下来应该是Dao、Service、Action等,但是这些我们做用户管理的时候已经做好了,我们现在来改造它们。
先改造Action层:
上面我们在进入添加页面之前我们先从数据库将所有角色类型全部取出放入ActionContext域中(需要注入roleService来获得所有角色信息)。
我们之前用户“添加”页面的角色这一块是空的:
我们现在将我们放置在ActionContext域中的角色信息取出,使用struts的<s:checkboxlist>标签来将数据以复选框的形式展示在页面:
效果:
可以看到用户角色一栏已经出现了我们之前添加的角色了。
然后接下来保存用户的时候我们也要将给用户分配的角色保存下来,我们继续完成Action的改造:
我们把userRoleIds引进来,用于获取用户的角色选择,然后我们把原来的save(User user)和update(User user)方法全部改为
保存用户和角色信息saveUserAndRole(User user, String[] userRoleIds)和
修改用户和角色信息updateUserAndRole(User user, String[] userRoleIds);
我们在UserService接口中定义这些方法,然后在UserServiceImpl中实现这两个方法:
其中saveUserRole和deleteUserRoleByUserId没有实现,我们在userDao接口中添加它们,在userDaoImpl中实现它们:
我们做到了新增和编辑的时候保存给注册用户时选择的相应角色。
我们来实验一下:
先来添加一个用户,给他分配一个角色:
保存之后到数据库中查看,发现我们为用户设置了相应的角色:
用户权限id中间表:
妮妮的id
权限id:
然后是编辑界面:
我们的编辑界面还没有设置数据回显,我们先编辑jsp界面,将我们的数据设置在编辑页面上:
然后修改UserAction中editUI()方法,使其也加载用户的角色:
上面新添加了getRoleIdByUserId方法,我们在UserService中添加getRoleIdByUserId方法,然后在其实现类UserServiceImpl中实现这个方法:
上面Dao新添加了getRoleIdByUserId方法,我们在UserDao中添加getRoleIdByUserId方法,然后在其实现类UserDaoImpl中实现这个方法:
测试:
点击编辑界面,将管理员的权限也勾选上:
保存之后可以看到妮妮这个用户又多了一个角色:
一个角色可以有多个权限,一个权限可以被多个角色使用。
那我们下面就来使用我们完成的角色。
我们先来看一下需求,记不记得之前的用户编辑界面:
可以看到,我们注册用户的时候是要给用户安排一个角色的,而我们的角色在角色管理系统里面已经创建好了,可以从创建好的角色中挑选需要的角色(该角色拥有自己特有的权限)。
所以,我们说一下用户与角色的关系设计:
用户:用户1,用户2
角色:管理员,一般用户
用户与角色的关系:多对多
一个用户可以有多个角色;一个角色可以被多个用户使用
用户:user
用户id,名称...
1 用户1
2 用户2
用户角色:user_role
用户id,角色id
1 1
1 2
2 2
角色:role
角色Id,名称
1 管理员
2 一般用户
总体就是:
查询出用户后;需要知道这个用户有哪些角色
我们下面来实现它。实现它就是改造之前的用户管理模块.我们刚刚设计过,“用户”表和“角色”表我们之前都有的,这里不能动,我们需要做的就是设计编写出“用户与角色”这张中间表:
UserRole.java:
联合主键类(需要实现Serializable接口和改写equals和hashCode方法)
UserRoleId.java:
然后写我们的映射文件:
UserRole.hbm.xml
按理来说接下来应该是Dao、Service、Action等,但是这些我们做用户管理的时候已经做好了,我们现在来改造它们。
先改造Action层:
上面我们在进入添加页面之前我们先从数据库将所有角色类型全部取出放入ActionContext域中(需要注入roleService来获得所有角色信息)。
我们之前用户“添加”页面的角色这一块是空的:
我们现在将我们放置在ActionContext域中的角色信息取出,使用struts的<s:checkboxlist>标签来将数据以复选框的形式展示在页面:
效果:
可以看到用户角色一栏已经出现了我们之前添加的角色了。
然后接下来保存用户的时候我们也要将给用户分配的角色保存下来,我们继续完成Action的改造:
我们把userRoleIds引进来,用于获取用户的角色选择,然后我们把原来的save(User user)和update(User user)方法全部改为
保存用户和角色信息saveUserAndRole(User user, String[] userRoleIds)和
修改用户和角色信息updateUserAndRole(User user, String[] userRoleIds);
我们在UserService接口中定义这些方法,然后在UserServiceImpl中实现这两个方法:
其中saveUserRole和deleteUserRoleByUserId没有实现,我们在userDao接口中添加它们,在userDaoImpl中实现它们:
我们做到了新增和编辑的时候保存给注册用户时选择的相应角色。
我们来实验一下:
先来添加一个用户,给他分配一个角色:
保存之后到数据库中查看,发现我们为用户设置了相应的角色:
用户权限id中间表:
妮妮的id
权限id:
然后是编辑界面:
我们的编辑界面还没有设置数据回显,我们先编辑jsp界面,将我们的数据设置在编辑页面上:
然后修改UserAction中editUI()方法,使其也加载用户的角色:
上面新添加了getRoleIdByUserId方法,我们在UserService中添加getRoleIdByUserId方法,然后在其实现类UserServiceImpl中实现这个方法:
上面Dao新添加了getRoleIdByUserId方法,我们在UserDao中添加getRoleIdByUserId方法,然后在其实现类UserDaoImpl中实现这个方法:
测试:
点击编辑界面,将管理员的权限也勾选上:
保存之后可以看到妮妮这个用户又多了一个角色: