读取标注了@Controller的类的所有方法,如果方法上标注了@SourceAuth注解,则解析成为AuthVO对象
@Component
public class AuthorityConfig implements ApplicationContextAware, ApplicationRunner {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public void run(ApplicationArguments args) throws Exception {
// 读取菜单配置
MenuContext menuContext = buildMenu();
// 构建权限
List<AuthVO> authList = buildAuth();
}
/**
* 构建权限
*/
private List<AuthVO> buildAuth() {
List<AuthVO> authList = new ArrayList<>();
// 读取权限配置
Map<String, Object> beansWithAnnotation = applicationContext.getBeansWithAnnotation(Controller.class);
beansWithAnnotation.forEach((className, controller) -> {
Class<?> clazz = controller.getClass();
Method[] methods = controller.getClass().getMethods();
for (Method method : methods) {
Method mostSpecificMethod = AopUtils.getMostSpecificMethod(method, clazz);
SourceAuth sourceAuth = mostSpecificMethod.getAnnotation(SourceAuth.class);
if (Objects.isNull(sourceAuth)) {
continue;
}
AuthVO authVO;
String[] menuKeys = sourceAuth.menuKeys();
String[] authKeys = sourceAuth.authKeys();
for (String menuKey : menuKeys) {
for (String authKey : authKeys) {
authVO = new AuthVO();
authVO.setMenuKey(menuKey);
authVO.setAuthKey(menuKey + "." + authKey);
authVO.setAuthName(sourceAuth.authName());
authList.add(authVO);
}
}
}
});
return authList.stream().distinct().collect(Collectors.toList());
}
}