最近工作中需要在微信管理端的應用中使用自定義註解實現權限控制,必須保持和後台權限一致,因為賬戶系統分為partner、alliance、merchant三種,頁面和權限也分為三套所以微信後台也要分別對著三種權限進行控制。
实现HandlerInterceptor
public class AuthenticationInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 将handler强转为HandlerMethod, 前面已经证实这个handler就是HandlerMethod
HandlerMethod handlerMethod = (HandlerMethod) handler;
// 从方法处理器中获取出要调用的方法
Method method = handlerMethod.getMethod();
// 获取出方法上的RequiresPermissions注解
RequiresPermissions permissions = method.getAnnotation(RequiresPermissions.class);
if (permissions == null) {
// 如果注解为null, 说明不需要拦截, 直接放过
return true;
}
String accountType = SessionUtil.getAccountType(request);
// 获取用户所有权限
Set<String> permsSet = SessionUtil.permissions(request, response);
String[] values = null;
if (accountType.equals(USER_TYPE.PARTNER.key)) {
values = permissions.partner();
} else if (accountType.equals(USER_TYPE.ALLIANCE.key)) {
values = permissions.alliance();
} else if (accountType.equals(USER_TYPE.MERCHANT.key)) {
values = permissions.merchant();
}
if (values.length > 0) {
// 权限列表为空
if (permsSet.size() == 0) {
if (SessionUtil.isSuperAdmin(request.getSession())) {
// 如果是超级管理员
return true;
} else {
return false;
}
}
for (String permission : values) {
if (!permsSet.contains(permission)) {
return false;
}
}
}
// 拦截之后应该返回公共结果, 这里没做处理
return true;
}
}
配置拦截器
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter{
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
registry.addInterceptor(new AuthenticationInterceptor()).addPathPatterns("/**");
}
}
自定义权限注解
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequiresPermissions {
String[] partner() default {};
String[] alliance() default {};
String[] merchant() default {};
}