SSM练习 第5天
-
查询用户/角色/权限信息
-
用户动态授权
-
获取用户名
-
用户授权页面权限控制和后台权限控制
-
系统日志
重点:获取用户名实现方法,AOP实现日志操作。
第1章 用户/角色/权限信息关联查询
1.1 查询用户实现的效果
通过查询用户,然后查看用户的角色信息,再查看用户的授权信息,效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dVvDKFtY-1602591363122)(images/1542668969788.png)]
1.2 实现思路分析
我们可以分为3个步骤实现,第1步:查询用户信息,第2步:根据用户的id查询用户的角色信息,但角色信息需要关联用户角色表(sys_user_role),第3步:查询用户菜单信息。实现的SQL语句如下:
--查询用户
select * from sys_user where id=1;
--查询对应角色
select * from sys_user_role sur,sys_role sr where sur.userid=sr.id and id=1;
--查询菜单信息
select * from sys_role_permission srp,sys_permission sp where srp.permissionid=sp.id and srp.roleid=1
1.3 映射关系分析
用户与角色的关系属于多对多关系,角色和权限的关系也属于多对多,我们可以通过这种映射关系来实现数据查找,而多对多在MyBatis注解中可以通过@Result(many=@Many(…))实现。我们可以先加载用户,再通过@Result(many=@Many(…))加载用户的角色信息,还可以通过角色的查询再加载授权信息。
修改用户与角色的关系,在SysUser中添加List roles属性
public class SysUser {
private Long id;
private String username; //登录账号
private String email;
private String password; //登录的密码
private String phoneNum; //也可以用于登录
private int status; //状态,0表示未审核,1.已激活
//用户和角色之间的关系属于一对多,也属于双向多对多
private List<SysRole> roles;
//略....
}
1.4 代码实现
1.4.1 Controller
在SysUserController中添加查询代码
/***
* 查询用户信息
* @param id
* @param model
* @return
*/
@RequestMapping(value = "/one")
public String findOne(long id,Model model){
//根据ID查询用户信息
SysUser sysUser = userService.findById(id);
//将信息存入Model
model.addAttribute("sysUser",sysUser);
return "user-show";
}
1.4.2 Service代码
/***
* 接口
* 查询用户信息
* @param id
* @return
*/
SysUser findById(long id);
/***
* 查询用户信息-实现类
* @param id
* @return
*/
@Override
public SysUser findById(long id) {
return userDao.findById(id);
}
1.4.3 Dao代码
1.4.3.1 UserDao代码
/***
* 查询用户信息
* @param id
* @return
*/
@Select(value = "select * from sys_user where id=#{id}")
@Results(
//根据用户信息查询角色信息
@Result(property ="roles",column = "id",
many = @Many(select = "com.itheima.dao.RoleDao.getByUserId",
fetchType = FetchType.LAZY))
)
SysUser findById(long id);
1.4.3.2 RoleDao代码
这里需要根据用户的ID查询用户的角色信息
/***
* 根据用户ID查询用户角色信息
* @param id
* @return
*/
@Select("select * from sys_role sr,sys_user_role sur where sr.id=sur.roleid and sur.userid=#{userId}")
@Results({
@Result(property = "id",column = "id"),
@Result(property = "permissions",
column = "id",
many = @Many(select = "com.itheima.dao.PermissionDao.rolePermissionList"))
})
List<SysRole> userRoleList(Integer id);
1.4.3.3 PermissonDao代码
这里需要根据角色ID查询角色的授权信息
/***
* 根据角色ID查询权限信息
* @return
*/
@Select("select * from sys_role_permission srp,sys_permission sp where srp.permissionid=sp.id and srp.roleid=#{id}")
List<SysPermisson> getByRoleId(Long id);
1.4.4 JSP页面
user-show页面代码如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZKRdlCkd-1602591363125)(D:/html/ssm/4a/images/1542669182450.png)]
上图代码如下:
<tr data-tt-id="0">
<td colspan="2">${user.username}</td>
</tr>
<tbody>
<c:forEach items="${user.roles}" var="role" varStatus=