使用Aop实现权限注解

权限注解

AnonymousPermission

/**
 * 未有用户登录时,进行匿名登录,允许匿名访问<br/>
 * ----类注释,代表访问类中全部方法前检查<br/>
 * ----方法注释,代表访问当前方法前检查
 * 
 * @author
 *
 */
@Target({
    
     ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AnonymousPermission {
    
    
}

package com.szqbl.lib.config;

import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;

import com.szqbl.lib.aop.AnonymousPermission;

@Component
public class AnonymousPermissionConfig implements ApplicationListener<ContextRefreshedEvent> {
    
    
	private static final Logger logger = LoggerFactory.getLogger(AnonymousPermissionConfig.class);
	public static Set<String> AnonymousPermissionUrls = new HashSet<>();
	public static Set<String> AnonymousPermissionUrls_PathVariable = new HashSet<>();

	@Override
	public void onApplicationEvent(ContextRefreshedEvent event) {
    
    
		// 根容器为Spring容器
		if (event.getApplicationContext().getParent() == null) {
    
    
			Map<String, Object> beans = event.getApplicationContext().getBeansWithAnnotation(RequestMapping.class);
			for (Object bean : beans.values()) {
    
    
				RequestMapping classRM = bean.getClass().getAnnotation(RequestMapping.class);
				AnonymousPermission classAR = bean.getClass().getAnnotation(AnonymousPermission.class);
				if (classAR != null) {
    
    
					Method[] methods = bean.getClass().getMethods();
					for (Method declaredMethod : methods) {
    
    
						RequestMapping methodRM = AnnotationUtils.findAnnotation(declaredMethod, RequestMapping.class);
						if (methodRM != null) {
    
    
							if (classRM.value().length == 0) {
    
    
								if (methodRM.value().length == 0) {
    
    
									AnonymousPermissionUrls.add("");
								} else {
    
    
									for (String method : methodRM.value()) {
    
    
										AnonymousPermissionUrls.add(method);
									}
								}
							} else {
    
    
								for (String path : classRM.value()) {
    
    
									if (methodRM.value().length == 0) {
    
    
										AnonymousPermissionUrls.add(path);
									} else {
    
    
										for (String method : methodRM.value()) {
    
    
											if (path.endsWith("/"))
												path = path.substring(0, path.length() - 1);
											if (method.startsWith("/"))
												method = method.substring(1);
											if ("".equals(path)) {
    
    
												AnonymousPermissionUrls.add(method);
											} else if ("".equals(method)) {
    
    
												AnonymousPermissionUrls.add(path);
											} else {
    
    
												AnonymousPermissionUrls.add(path + "/" + method);
											}
										}
									}
								}
							}
						}
					}
				} else {
    
    
					Method[] methods = bean.getClass().getMethods();
					for (Method declaredMethod : methods) {
    
    
						RequestMapping methodRM = AnnotationUtils.findAnnotation(declaredMethod, RequestMapping.class);
						AnonymousPermission methodAR = AnnotationUtils.findAnnotation(declaredMethod,
								AnonymousPermission.class);
						if (methodRM != null && methodAR != null) {
    
    
							if (classRM.value().length == 0) {
    
    
								if (methodRM.value().length == 0) {
    
    
									AnonymousPermissionUrls.add("");
								} else {
    
    
									for (String method : methodRM.value()) {
    
    
										AnonymousPermissionUrls.add(method);
									}
								}
							} else {
    
    
								for (String path : classRM.value()) {
    
    
									if (methodRM.value().length == 0) {
    
    
										AnonymousPermissionUrls.add(path);
									} else {
    
    
										for (String method : methodRM.value()) {
    
    
											if (path.endsWith("/"))
												path = path.substring(0, path.length() - 1);
											if (method.startsWith("/"))
												method = method.substring(1);
											if ("".equals(path)) {
    
    
												AnonymousPermissionUrls.add(method);
											} else if ("".equals(method)) {
    
    
												AnonymousPermissionUrls.add(path);
											} else {
    
    
												AnonymousPermissionUrls.add(path + "/" + method);
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		AnonymousPermissionUrls.stream().filter(url -> url.indexOf("{") >= 0 && url.indexOf("}") >= 0)
				.forEach(url -> AnonymousPermissionUrls_PathVariable.add(url));
		logger.info("允许匿名访问地址:" + AnonymousPermissionUrls);
	}
}

猜你喜欢

转载自blog.csdn.net/weng74/article/details/114305862