package cn.com.tenlion.usercenter.aspect; import cn.com.tenlion.usercenter.login.guest.GuestProperties; import ink.wgink.common.component.SecurityComponent; import ink.wgink.exceptions.base.SystemException; import ink.wgink.pojo.dtos.role.RoleSimpleDTO; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.*; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.List; @Order(-1) @Component @Aspect public class GuestControllerAspect { /** * 默认新增事务 */ private static String[] DEFAULT_SAVE_ARRAY = {"add*", "save*", "insert*", "create*", "new*"}; /** * 默认删除事务 */ private static String[] DEFAULT_REMOVE_ARRAY = {"delete*", "remove*"}; /** * 默认执行事务 */ private static String[] DEFAULT_UPDATE_ARRAY = {"update*", "edit*", "reset*"}; /** * 默认其它事务 */ private static String[] DEFAULT_OTHER_ARRAY = {"send*", "exec*", "set*", "login*", "register*", "sign*", "rest*", "upload*"}; @Autowired private GuestProperties guestProperties; @Autowired private SecurityComponent securityComponent; @Pointcut("execution(public * *..controller..*.*(..))") public void apiLogCutPoint() { } /** * 访客没有曾、删、改权限,只有查看权限 * * @param proceedingJoinPoint * @return * @throws Throwable */ @Around("apiLogCutPoint()") public Object apiLogAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { if (guestProperties == null) { return proceedingJoinPoint.proceed(); } // 非访客,不处理 if (!isGuest()) { return result(proceedingJoinPoint); } Method method = ((MethodSignature) proceedingJoinPoint.getSignature()).getMethod(); // GET不处理 if (isGetMethod(method)) { return result(proceedingJoinPoint); } throw new SystemException("权限不足"); } private Object result(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { Object result; try { result = proceedingJoinPoint.proceed(); } catch (Throwable e) { throw e; } return result; } private boolean isGuest() { if (securityComponent == null) { return false; } if (securityComponent.getCurrentUser() == null) { return false; } if (securityComponent.getCurrentUser().getUserUsername().equalsIgnoreCase("admin")) { return false; } List roles = securityComponent.getCurrentUser().getRoles(); for (RoleSimpleDTO roleSimpleDTO : roles) { for (String guestRoleId : guestProperties.getGuestRoleIds()) { if (StringUtils.equals(roleSimpleDTO.getRoleId(), guestRoleId)) { return true; } } } return false; } private boolean isGetMethod(Method method) { GetMapping getMapping = method.getAnnotation(GetMapping.class); if (getMapping != null) { return true; } RequestMapping requestMapping = method.getAnnotation(RequestMapping.class); if (requestMapping == null) { return false; } RequestMethod[] requestMethods = requestMapping.method(); for (RequestMethod requestMethod : requestMethods) { if (StringUtils.equalsIgnoreCase(requestMethod.name(), "GET")) { return true; } } return false; } }