使用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);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值