[企业权限管理项目](八)权限关联与控制

权限

  • 用户关联角色
    • UserController
    • IUserService
    • IUserDao
    • 页面
    • 调试
    • 实现真正角色添加
      • UserController
      • IUserService
      • IUserDao
      • 页面
  • 角色关联权限
    • RoleController
    • IRoleService
    • IRoleDAO
    • 页面
  • 权限控制
    • 服务端方法级权限控制
      • JSR-250注解
      • 测试
    • 页面端权限控制

用户关联角色

  • 在user-list.jsp点击添加角色,携带userid请求
  • 根据userid查询用户,根据userid查询用户可以添加角色,Service在Dao层完成查询user表和user_role表
  • 查询结果显示在user-role-add.jsp上,显示出用户可以添加的角色,勾选后将userid和roleid(数组)返回controller,这是要完成对user_role的insert
    [企业权限管理项目](八)权限关联与控制_第1张图片

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 otherRoles = userService.findOtherRoles(userid);
        mv.addObject("user", userInfo);
        mv.addObject("roleList", otherRoles);
        mv.setViewName("user-role-add");
        return mv;
    }

IUserService

  List findOtherRoles(String userId) throws Exception;
  
 @Override
    public List 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 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 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 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 findOtherPermissions(String roleId);

页面

  • role-permission-add.jsp
  • 实现思路与用户关联角色一样

权限控制

服务端方法级权限控制

  • 在服务器端我们可以通过Spring security提供的注解对方法来进行权限控制
  • Spring Security在方法的权限控制上 支持三种类型的注解,JSR-250注解,@Secured注解和支持表达式的注解
  • 这些注解均默认关闭,需要单独通过global-method-security元素的对应属性进行启用

JSR-250注解

-1. spring-srcurity.xml中开启

	 
  • 开启注解后,该注解提供三个

    • @RolesAllowed表示访问对应方法时所应该具有的角色

        示例: @RolesAllowed({"USER", "ADMIN"})  
        该方法只要具有"USER", "ADMIN"任意一种权限就可以访问。这里可以省略前缀ROLE_,实际的权限可能是ROLE_ADMIN 
      
    • @PermitAll表示允许所有的角色进行访问,也就是说不进行权限控制

    • @DenyAll是和PermitAll相反的,表示无论什么角色都不能访问

  • 2 . 在指定方法上加上@RolesAllowed并在value指定权限

  • 3 .在pom.xml中导入依赖(注意,这个项目是多模块开发的,在父工程的pom.xml中导入)
    [企业权限管理项目](八)权限关联与控制_第2张图片

[企业权限管理项目](八)权限关联与控制_第3张图片

测试

  • 如黑用户 Admin,USER,GUEST权限操作不同的方法,如对于product这个只有user权限能够更改
  • 权限操作资格不够时会报错403,代表权限不足,为了更好的用户交互,引入一个403.jsp页面告知用户权限不足

页面端权限控制

在jsp页面中我们可以使用spring security提供的权限标签来进行权限控制

你可能感兴趣的:(企业权限管理项目实战)