权限
用户关联角色
- 在user-list.jsp点击添加角色,携带userid请求
- 根据userid查询用户,根据userid查询用户可以添加角色,Service在Dao层完成查询user表和user_role表
- 查询结果显示在user-role-add.jsp上,显示出用户可以添加的角色,勾选后将userid和roleid(数组)返回controller,这是要完成对user_role的insert
UserController
//查询用户以及用户可以添加的角色
@RequestMapping("/findUserByIdAndAllRole.do")
public ModelAndView findUserByIdAndAllRole(@RequestParam(name = "id", required = true) String userid) throws Exception {
ModelAndView mv = new ModelAndView();
//1.根据用户id查询用户
UserInfo userInfo = userService.findById(userid);
//2.根据用户id查询可以添加的角色
List<Role> otherRoles = userService.findOtherRoles(userid);
mv.addObject("user", userInfo);
mv.addObject("roleList", otherRoles);
mv.setViewName("user-role-add");
return mv;
}
IUserService
List<Role> findOtherRoles(String userId) throws Exception;
@Override
public List<Role> findOtherRoles(String userId) {
return userDao.findOtherRoles(userId);
}
IUserDao
@Select("select * from role where id not in (select roleId from users_role where userId=#{userId})")
List<Role> findOtherRoles(String userId);
页面
user-role-add.jsp
调试
在/系统管理/用户管理/中,点击“添加角色”,会跳转到user-role-add.jsp,显示出可以添加的角色,进行勾选选择添加后,后续去修改user_role表
实现真正角色添加
UserController
一个参数为userid,另一个参数为role数组
//给用户添加角色
@RequestMapping("/addRoleToUser.do")
public String addRoleToUser(@RequestParam(name = "userId", required = true) String userId, @RequestParam(name = "ids", required = true) String[] roleIds) {
userService.addRoleToUser(userId, roleIds);
return "redirect:findAll.do";
}
IUserService
void addRoleToUser(String userId, String[] roleIds);
UserServiceImpl
@Override
public void addRoleToUser(String userId, String[] roleIds) {
// FOR循环进行添加
for(String roleId:roleIds){
userDao.addRoleToUser(userId,roleId);
}
}
IUserDao
@Insert("insert into users_role(userId,roleId) values(#{userId},#{roleId})")
void addRoleToUser(@Param("userId") String userId, @Param("roleId") String roleId);
页面
注意添加完后,进行的是/user/findAll.do
角色关联权限
- 在role-list.jsp页面上点击“添加权限”,发起请求
- 流程与user关联角色是一样的
RoleController
//根据roleId查询role,并查询出可以添加的权限
@RequestMapping("/findRoleByIdAndAllPermission.do")
public ModelAndView findRoleByIdAndAllPermission(@RequestParam(name = "id", required = true) String roleId) throws Exception {
ModelAndView mv = new ModelAndView();
//根据roleId查询role
Role role = roleService.findById(roleId);
//根据roleId查询可以添加的权限
List<Permission> otherPermissions = roleService.findOtherPermissions(roleId);
mv.addObject("role", role);
mv.addObject("permissionList", otherPermissions);
mv.setViewName("role-permission-add");
return mv;
}
IRoleService
Role findById(String roleId) throws Exception;
List<Permission> findOtherPermissions(String roleId) throws Exception;
IRoleDAO
@Select("select * from role where id=#{roleId}")
@Results({
@Result(id = true,property = "id",column = "id"),
@Result(property = "roleName",column = "roleName"),
@Result(property = "roleDesc",column = "roleDesc"),
@Result(property = "permissions",column = "id",javaType = List.class,many = @Many(select = "com.itheima.ssm.dao.IPermissionDao.findPermissionByRoleId"))
})
Role findById(String roleId);
@Select("select * from permission where id not in (select permissionId from role_permission where roleId=#{roleId})")
List<Permission> findOtherPermissions(String roleId);
页面
- role-permission-add.jsp
- 实现思路与用户关联角色一样
权限控制
服务端方法级权限控制
- 在服务器端我们可以通过Spring security提供的注解对方法来进行权限控制
- Spring Security在方法的权限控制上 支持三种类型的注解,JSR-250注解,@Secured注解和支持表达式的注解
- 这些注解均默认关闭,需要单独通过global-method-security元素的对应属性进行启用
JSR-250注解
-1. spring-srcurity.xml中开启
<security:global-method-security jsr250-annotations="enabled"/>
-
开启注解后,该注解提供三个
-
@RolesAllowed表示访问对应方法时所应该具有的角色
示例: @RolesAllowed({"USER", "ADMIN"}) 该方法只要具有"USER", "ADMIN"任意一种权限就可以访问。这里可以省略前缀ROLE_,实际的权限可能是ROLE_ADMIN
-
@PermitAll表示允许所有的角色进行访问,也就是说不进行权限控制
-
@DenyAll是和PermitAll相反的,表示无论什么角色都不能访问
-
-
2 . 在指定方法上加上@RolesAllowed并在value指定权限
-
3 .在pom.xml中导入依赖(注意,这个项目是多模块开发的,在父工程的pom.xml中导入)
测试
- 如黑用户 Admin,USER,GUEST权限操作不同的方法,如对于product这个只有user权限能够更改
- 权限操作资格不够时会报错403,代表权限不足,为了更好的用户交互,引入一个403.jsp页面告知用户权限不足
页面端权限控制
在jsp页面中我们可以使用spring security提供的权限标签来进行权限控制