目录
六、加入通用拦截器(基于路径的权限校验)
第一个是登陆验证第二个是权限校验
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里面
八、修改用户和角色的关联表
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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/80108.html