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

导读:本篇文章讲解 从0搭建一套spring boot项目(通用拦截器+查询到用户角色+修改用户和角色的关联表)二,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

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

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

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


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

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

1、可以加多个拦截器

2、配置拦截器WebMvcConfig

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

//配置类
@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

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

登录拦截器已经做好


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加入

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

 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里面 访问一个没权限的

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

 七、通过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里面

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

 记得提前到数据库menu表中加入从0搭建一套spring boot项目(通用拦截器+查询到用户角色+修改用户和角色的关联表)二

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

1、UserController里面

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

 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

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

 注:

项目代码的gitee地址 用户权限项目从0搭建一套spring boot项目(通用拦截器+查询到用户角色+修改用户和角色的关联表)二https://gitee.com/hbuws_admin_admin_admin/demo2022

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/80108.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!