前沿
权限认证是一个常见的需求,用自定义注解可以很简单的实现权限的验证。废话不多说,直接讲解。
自定义注解
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface RoleNum {
//默认0为一般用户,1为普通管理员,2为超级管理员
RoleEnum role();
}
用一个枚举类存放管理权限信息
可根据个人需求不同进行改变。
@Getter
public enum RoleEnum {
USER(0, "普通用户"),
ADMIN(1, "普通管理员"),
SUPPER_ADMIN(2, "系统管理员"),
;
private Integer value;
private String role;
RoleEnum(Integer value, String role) {
this.value = value;
this.role = role;
}
public static String getRole(Integer integer) {
HashMap<Integer, String> hashMap = new HashMap<>();
hashMap.put(SUPPER_ADMIN.getValue(), SUPPER_ADMIN.getRole());
hashMap.put(ADMIN.getValue(), ADMIN.getRole());
hashMap.put(USER.getValue(), USER.getRole());
return hashMap.get(integer);
}
public static Integer getValue(String role) {
HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put(SUPPER_ADMIN.getRole(), SUPPER_ADMIN.getValue());
hashMap.put(ADMIN.getRole(), ADMIN.getValue());
hashMap.put(USER.getRole(), USER.getValue());
return hashMap.get(role);
}
}
自定义一个Interceptor实现权限验证
@Slf4j
@Service
public class AuthRoleInterceptor extends HandlerInterceptorAdapter {
@Autowired
private UserService userService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
String json = JSON.toJSONString(ResultVOUtil.error(ResultEnum.AUTHENTICATION_ERROR));
User user = userService.getCurrentUser();
//若当前用户为未认证用户则跳过权限验证,交给security做身份认证
if (user == null) {
return true;
}
log.info("============执行权限验证============");
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
//获取方法上的注解
RoleNum roleNum = handlerMethod.getMethodAnnotation(RoleNum.class);
if (roleNum == null) {
return true;
}
//注解上的role对应的值
Integer roleValue = roleNum.role().getValue();
//用户数据库中对应的role值
Integer userValue = user.getRole();
log.info("RoleValue:{},userRole:{}", roleValue, userValue);
//比较,判断权限
if (userValue >= roleValue) {
return true;
} else {
json = JSON.toJSONString(ResultVOUtil.error(ResultEnum.PERMISSION_DENNY));
log.info("============权限不足===============");
}
}
response.getWriter().append(json);
return false;
}
}
最后将自定义的拦截器配入
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private AuthRoleInterceptor authRoleInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authRoleInterceptor);
}
}
注解的使用
直接使用在controller层所需的方法上 举例如下:
@GetMapping("/getAll")
@RoleNum(role = RoleEnum.ADMIN)
public Map<String, List<User>> getAllUser() {
Map<String, List<User>> map = userService.getAllUser();
return map;
}