Spring Security 权限控制

紧接着上一篇博客,现在我们开始实现我们的权限管理。

1.权限组

之前用户可以通过用户角色表和用户表进行关联,进而分配用户不同的角色,也可以通过菜单角色与菜单表进行关联,进而分配不同的角色,可以拥有不同的菜单权限。那权限组模块主要就是进行用户角色的相关操作,包括角色里面所关联的菜单。所以出了角色的相关操作(增加角色,删除角色,修改角色等等),还可以对菜单进行操作(查询、更新角色所拥有的菜单)。

1.1.实现功能

  • 需要注意的是Spring Security用的角色都是以ROLE_开头的所以我们需要判断一下添加的角色是否是以ROLE_开头,是的话那就直接添加,没有的话后端需要自动添加上去,否则不会被Security掌控。
  • 第二就是查询所有菜单,但这里的菜单查询不和“菜单列表”模块时的菜单查询一样,这里有对应的子菜单(分为3级),所以需要查询写方法和SQL语句。

新建PermissionController

PermissionController.java

@RestController
@RequestMapping("/system/basic/permiss")
public class PermissionController {

    @Resource
    private IRoleService roleService;
    @Resource
    private IMenuService menuService;
    @Resource
    private IMenuRoleService menuRoleService;

    @ApiOperation(value = "获取所有角色")
    @GetMapping("/")
    public List<Role> getAllRoles() {
        return roleService.list();
    }

    @ApiOperation(value = "添加角色")
    @PostMapping("/role")
    public RespBean addRole(@RequestBody Role role) {
        if (!role.getName().startsWith("ROLE_")) {
            role.setName("ROLE_" + role.getName());
        }
        if (roleService.save(role)) {
            return RespBean.success("添加成功");
        }
        return RespBean.error("添加失败");
    }


    @ApiOperation(value = "删除角色")
    @DeleteMapping("/{id}")
    public RespBean deleteRole(@PathVariable Integer id) {
        if (roleService.removeById(id)) {
            return RespBean.success("删除成功");
        }
        return RespBean.error("删除失败");
    }


    @ApiOperation(value = "查询所有菜单")
    @GetMapping("/menus")
    public List<Menu> getAllMenus() {
        return menuService.getAllMenus();
    }

    @ApiOperation(value = "根据角色id查询菜单id")
    @GetMapping("/mid/{rid}")
    public List<Integer> getMidByRid(@PathVariable Integer rid) {
        return menuRoleService
                // 根据rid(角色id)查询mid(菜单id)
                .list(new QueryWrapper<MenuRole>()
                        .eq("rid", rid))
                .stream()
                .map(MenuRole::getMid)
                .collect(Collectors.toList());
    }

    @ApiOperation(value = "更新角色菜单")
    @PutMapping("/")
    public RespBean updateMenuRole(Integer rid, Integer[] mids) {
        return menuRoleService.updateMenuRole(rid, mids);
    }

}

1.2.权限组Mapper层

MenuMapper.java

public interface MenuMapper extends BaseMapper<Menu> {

    /**
     *通过用户ID查询菜单列表
     * @param adminId
     * @return
     */
    List<Menu> getMenusByAdminId(Integer adminId);

    /**
     * 根据角色获得菜单列表
     * @return
     */
    List<Menu> getMenusWithRole();
    /**
     * 查询所有菜单
     * @return
     */
    List<Menu> getAllMenus();
}

MenuRoleMapper.java

public interface MenuRoleMapper extends BaseMapper<MenuRole> {
    /**
     * 批量更新
     * @param rid
     * @param mids
     * @return Integer
     */
    Integer insertRecord(@Param("rid") Integer rid, @Param("mids") Integer[] mids);
}

1.3.SQL语句

在MenuMapper.xml中添加以下代码:

<resultMap id="MenusWithChildren" type="com.kt.pojo.Menu" extends="BaseResultMap">
        <!-- 一级菜单 -->
        <id column="id1" property="id"/>
        <result column="name1" property="name"/>
        <!-- 二级菜单 -->
        <collection property="children" ofType="com.kt.pojo.Menu">
            <id column="id2" property="id"/>
            <result column="name2" property="name"/>
            <!-- 三级菜单 -->
            <collection property="children" ofType="com.kt.pojo.Menu">
                <id column="id3" property="id"/>
                <result column="name3" property="name"/>
            </collection>
        </collection>
    </resultMap>
<!-- 查询所有菜单 -->
    <select id="getAllMenus" resultMap="MenusWithChildren">
        SELECT
            m1.id AS id1,
            m1.`name` AS name1,
            m2.id AS id2,
            m2.`name` AS name2,
            m3.id AS id3,
            m3.`name` AS name3
        FROM
            t_menu m1,
            t_menu m2,
            t_menu m3
        WHERE
	        m1.id = m2.parentId
	    AND m2.id = m3.parentId
	    AND m3.enabled = TRUE
    </select>

在MenuRoleMapper.xml下添加如下代码:

<!-- 更新角色菜单 -->
    <insert id="insertRecord">
        insert into t_menu_role(mid, rid) values
        <foreach collection="mids" item="mid" separator=",">
            (#{mid}, #{rid})
        </foreach>
    </insert>

1.4.服务类

IMenuService.java

public interface IMenuService extends IService<Menu> {

    /**
     * 通过用户ID查询菜单列表
     * @return
     */
    List<Menu> getMenusByAdminId();
    /**
     * 根据角色获得菜单列表
     * @return
     */
    List<Menu> getMenusWithRole();
    /**
     * 查询所有菜单
     * @return
     */
    List<Menu> getAllMenus();
}

IMenuRoleService.java

public interface IMenuRoleService extends IService<MenuRole> {
    /**
     * 更新角色菜单
     * @param rid
     * @param mids
     * @return
     */
    RespBean updateMenuRole(Integer rid, Integer[] mids);
}

1.5.服务实现类

MenuServiceImpl.java

@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {

    @Resource
    private MenuMapper menuMapper;
    @Resource
    private RedisTemplate redisTemplate;

	......
	
    /**
     * 根据角色获得菜单列表
     * @return
     */
    @Override
    public List<Menu> getMenusWithRole() {
        return menuMapper.getMenusWithRole();
    }

    @Override
    public List<Menu> getAllMenus() {
        return menuMapper.getAllMenus();
    }
}

MenuRoleServiceImpl.java

@Service
public class MenuRoleServiceImpl extends ServiceImpl<MenuRoleMapper, MenuRole> implements IMenuRoleService {

    @Resource
    private MenuRoleMapper menuRoleMapper;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public RespBean updateMenuRole(Integer rid, Integer[] mids) {
        // 根据角色id删除角色下面的所有菜单
        menuRoleMapper.delete(new QueryWrapper<MenuRole>().eq("rid", rid));
        // 判断菜单id是否存在
        if (null == mids || 0 == mids.length) {
            // 不存在mid,不执行任何存在,只是一个“更新成功”提示。
            return RespBean.success("更新成功");
        }
        Integer result = menuRoleMapper.insertRecord(rid, mids);
        if (result == mids.length) {
            return RespBean.success("更新成功");
        }
        return RespBean.error("更新失败");
    }

}

1.2.测试

添加角色功能:

重启我们的项目,打开接口文档(将多余的参数值删去,只需要namenameZh

在这里插入图片描述

结果:

在这里插入图片描述

数据库变化:

在这里插入图片描述

根据角色id查询菜单id:

在这里插入图片描述

那么到这里权限组模块就完成了,其他功能就自行测试了,我这里就不进行测试了,下一篇主要实现部门管理模块:

👇👇👇
数据库存储过程实现CRUD

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值