10.权限关联与控制


 1.用户关联角色操作-流程分析

  2.用户关联角色操作 

  视图层的UsersControler  

    //查询用户以及可以添加的角色
    @RequestMapping("/findUserByIdAndAllRole.do")
    public ModelAndView findUserByIdAndAllRole(@RequestParam(name = "id") String userId)throws Exception{
        ModelAndView mv = new ModelAndView();
        //1.根据一个用户ID查询结果
        UserInfo userInfo = userService.findById(userId);
        //2.根据用户ID查询可以添加的角色
        List<Role> othersRoles = userService.findOthersRoles(userId);
        mv.addObject("user",userInfo);
        mv.addObject("rolesList",othersRoles);
        mv.setViewName("user-role-add2");
        return mv;
    }

  DAO层的 IUserDao

  

    // where not in ()
    @Select("select * from role where id not in (select roleId from users_role where userId = #{userId}) ")
    List<Role> findOthersRoles(String userId);

 视图层的UsersControler  

    //给用户添加选定的角色
    @RequestMapping("/addRoleToUser.do")
    public String addRoleToUser(@RequestParam(name = "userId") String userId,@RequestParam(name = "ids") String[] roleIds ) throws Exception {

        userService.addRoleToUser(userId, roleIds);
        return "redirect:findAll.do";
    }

Service层的接口实现类

    //通过ID查询用户详情
    @Override
    public UserInfo findById(String id) throws Exception{

        return userDao.findByUserId(id);
    }
    //通过用户ID查询其他可以添加的角色
    @Override
    public List<Role> findOthersRoles(String userId) throws Exception {

        return userDao.findOthersRoles(userId);

    }

    /**
     * 给用户添加选定角色
     *
     * @param userId
     * @param roleIds
     */
    @Override
    public void addRoleToUser(String userId, String[] roleIds) throws Exception{

        for (String roleId:roleIds
             ) {
            userDao.addRoleToUser(userId,roleId);
        }
        }

 DAO层的接口代码

    //插入用户的新角色DAO层实现
    //mybatis的@Param注解给接口方法形参指定匹配的#{name}
    @Insert("insert into users_role(userId,roleId) values(#{userId},#{roleId})")
    void addRoleToUser(@Param("userId") String userId, @Param("roleId") String roleId);

DAO层 IRoleDAO

    //1.通过roleID查询Role当前已有的权限
    @Select("select * from ROLE where Id = #{roleId}")
    Role findByRoleId(String roleId) throws Exception;

    //1.先根据角色ID查询中间表role_permission中已有的权限ID
    //2.再去取权限表中取已有的权限ID集合的补集
    @Select("select * from PERMISSION where id not in(select permissionId from ROLE_PERMISSION where roleId = #{roleId})")
    List<Permission> findOthersPermissoinByRoleId(String roleId)throws Exception;

    //插入角色Role的新权限DAO层实现
    //mybatis的@Param注解给接口方法形参指定匹配的#{name}
    @Insert("insert into ROLE_PERMISSION (roleId,permissionId) values(#{roleId},#{permissionId})")
    void addPermissionToRole(@Param("roleId") String roleId,@Param("permissionId") String permissionId)throws Exception;

 Service层  接口实现类

    //1.查询已有的权限根据角色ID
    @Override
    public Role findByRoleId(String roleId) throws Exception {
        return roleDao.findByRoleId(roleId);
    }
    //2.通过角色ID查询其它可以添加的权限
    @Override
    public List<Permission> findOthersPermissoin(String roleId) throws Exception{
        return roleDao.findOthersPermissoinByRoleId(roleId);
    }
    /**
     * 3.给角色添加还没有的权限
     */
    @Override
    public void addPermissionToRole(String roleId, String[] permissionsId) throws Exception {

        for (String permissionId:permissionsId
             ) {
            roleDao.addPermissionToRole(roleId,permissionId);
        }

    }

 Controller层

    //2.查询角色还没拥有的权限
    @RequestMapping("/findRoleByIdAndAllPermission.do")
    public ModelAndView findUserByIdAndAllRole(@RequestParam(name = "id") String roleId)throws Exception{
        ModelAndView mv = new ModelAndView();
        //1.根据一个roleID查询Role结果
        Role role = roleService.findByRoleId(roleId);
        //2.根据角色ID查询可以添加的权限
        List<Permission> otherPermissions = roleService.findOthersPermissoin(roleId);
        mv.addObject("role",role);
        mv.addObject("permissionList",otherPermissions);
        mv.setViewName("role-permission-add2");
        return mv;
    }

    //3.给角色添加未拥有的权限
    @RequestMapping("/addPermissionToRole.do")
    public String addPermissionToRole(@RequestParam(name = "roleId") String roleId,@RequestParam(name = "ids") String[] permissionsId) throws Exception{
        roleService.addPermissionToRole(roleId,permissionsId);
        return "redirect:findAll.do";
    }

 7.方法级别权限控制--JSR250注解的使用 

  pom.xml导入依赖坐标

        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>jsr250-api</artifactId>
            <version>1.0</version>
        </dependency>

  1、在web项目子模块的 spring-security.xml中添加以下配置信息:

    <!-- 开启JSR-250注解支持 -->
    <security:global-method-security jsr250-annotations="enabled"/>

  2、在指定的视图层的Controller方法上使用 @RolesAllowed("ADMIN")

  

    //添加产品(后跳转查询产品)
    @RequestMapping("/save.do")
    //添加JSR-250注解权限控制
    @RolesAllowed("ADMIN")
    public String save(Product product)throws Exception{
        productService.save(product);
        return "redirect:findAll.do";
    }

 

  @Secured("ROLE_ADMIN")  注解

====================

end

01-26 20:59
查看更多