从0搭建一套spring boot项目(通用拦截器+查询到用户角色+修改用户和角色的关联表)二

目录

六、加入通用拦截器(基于路径的权限校验)

 七、通过userId查询到用户角色

 八、修改用户和角色的关联表


六、加入通用拦截器(基于路径的权限校验)

第一个是登陆验证第二个是权限校验

1、可以加多个拦截器

2、配置拦截器WebMvcConfig

//配置类
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor())
                // 拦截规则 ,拦截那些路径
                .addPathPatterns("/**")
                // 那些路径不拦截
                .excludePathPatterns("/user/login","/error");
    }
    @Bean
    public LoginInterceptor loginInterceptor(){
        return new LoginInterceptor();
    }   
}

3、拦截器具体逻辑LoginInterceptor

public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("LoginInterceptor preHandle....");
        String uri = request.getRequestURI();
        System.out.println("当前路径:"+uri);
        /**
         * HandlerMethod=>Controller中标注@RequestMapping的方法
         *  需要配置静态资源不拦截时,添加这块逻辑  => 前后端分离项目
         *
         */
        // 是我们的conrtoller中的方法
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        String token = request.getHeader(GlobalConstant.HEADER_TOKEN);
        if (!TokenUtil.verify(token)) {
            // 未登录跳转到登录界面
            throw  new RuntimeException("no login!");
        }
        return true;
    }
}

localhost:8080/user/listAll

登录拦截器已经做好


4、路径的权限校验拦截器

5、配置拦截器WebMvcConfig

//配置类
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor())
                // 拦截规则 ,拦截那些路径
                .addPathPatterns("/**")
                // 那些路径不拦截
                .excludePathPatterns("/user/login","/error");

        registry.addInterceptor(authInterceptor())
                // 拦截规则 ,拦截那些路径
                .addPathPatterns("/**")
                // 那些路径不拦截
                .excludePathPatterns("/user/login","/error");
    }

    @Bean
    public LoginInterceptor loginInterceptor(){
        return new LoginInterceptor();
    }

    @Bean
    public AuthInterceptor authInterceptor(){
        return new AuthInterceptor();
    }
}

6、menu表实现mapper,service,impl等

7、UsrController中/login加入

 8、逻辑,通过userId,去找ref_user_role表,在通过ref_role_menu表会得到url

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--名称空间:对应mapper层某个接口的包的全名称-->
<mapper namespace="com.example.demo2022.mapper.MenuMapper">
    <select id="listUrlByUserId" resultType="java.lang.String">
        SELECT
            url
        FROM
            menu m
                INNER JOIN ref_role_menu rrm ON m.id = rrm.menu_id
                INNER JOIN ref_user_role rur ON rur.role_id = rrm.role_id
        WHERE
            rur.user_id = #{userId}
    </select>
</mapper>

9、interceptor包下新建一个AuthInterceptor类

public class AuthInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("AuthInterceptor preHandle....");
        String uri = request.getRequestURI();
        System.out.println("当前路径:"+uri);
        /**
         * HandlerMethod=>Controller中标注@RequestMapping的方法
         *  需要配置静态资源不拦截时,添加这块逻辑  => 前后端分离项目
         *
         */
        // 是我们的conrtoller中的方法
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        String token = request.getHeader(GlobalConstant.HEADER_TOKEN);
        User user = TokenUtil.getUser(token);
        // 一定是登陆验证成功的
       if(!user.getMenuUrlList().contains(uri)){
           throw  new RuntimeException("403 Forbidden!");
       }
        return true;
    }
}

先登录,复制下token到posman里面 访问一个没权限的

 七、通过userId查询到用户角色

1、把数据库中role实现出来

2、xml中查询出角色id

<mapper namespace="com.example.demo2022.mapper.RoleMapper">
    <select id="listRoleIdByUserId" resultType="java.lang.Long">
        select role_id from ref_user_role where user_id = #{userId}
    </select>

3、在impl层实现查询所有角色==》查询当前用户的角色==》设置选中

@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IRoleService {
    @Override
    public List<Role> listRoleByUserId(Long userId) {
        //查询到所有的角色
        List<Role> roleAllList = this.list();
        //查询到当前用户的角色
        Set<Long> userRoleSet =  this.baseMapper.listRoleIdByUserId(userId);
        //遍历设置选中
        for(Role role : roleAllList){
            if (userRoleSet.contains(role.getId())) {
                role.setChecked(true);
            }
        }

        return roleAllList;
    }
}

4、在RoleController中

@RestController
@RequestMapping("/role")
public class RoleController {

    @Autowired
    private IRoleService roleService;

    @RequestMapping("/listRoleByUserId")
    public WebResultJson listRoleByUserId(Long userId){
        List<Role>  roleList = roleService.listRoleByUserId(userId);
        return WebResultJson.ok(roleList);
    }
}

先登录,拿到token,再去posman里面

 记得提前到数据库menu表中加入

 八、修改用户和角色的关联表

1、UserController里面

 2、UserServiceImpl里面

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
    @Override
    public void updateUserRoles(UserRoleVo userRoleVo) {
        //多对多关联表的更新
        //1、先删除原有数据
        this.baseMapper.deleteUserRoleByUserId(userRoleVo.getUserId());
        //2、插入新数据
       // List<UserRoleVo> userRoleVoList = new ArrayList<>();
        this.baseMapper.insertBatchUserRole(userRoleVo);

    }
}

3、UserMapper里面实现

public interface UserMapper extends BaseMapper<User> {
    void deleteUserRoleByUserId(@Param("userId") Long userId);

    void insertBatchUserRole(@Param("userRoleVo") UserRoleVo userRoleVo);
}

4、UserMapper

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--名称空间:对应mapper层某个接口的包的全名称-->
<mapper namespace="com.example.demo2022.mapper.UserMapper">
    <insert id="insertBatchUserRole">
        insert into ref_user_role values
        <foreach collection="userRoleVo.roleIdList" item="item" separator=",">
            (
            #{userRoleVo.userId},
            #{item}
            )
        </foreach>
    </insert>
    <delete id="deleteUserRoleByUserId">
        delete from ref_user_role where user_id = #{userId}
    </delete>
</mapper>

先登录+获取token

 注:

项目代码的gitee地址 用户权限项目https://gitee.com/hbuws_admin_admin_admin/demo2022

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我老伯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值