1. 程式人生 > >Spring AOP做許可權控制

Spring AOP做許可權控制

最近看專案程式碼,發現許可權管理部分的程式碼都是直接寫在controller層。

那麼熟悉Spring的同學很明顯發現了,這是典型的可以用切面處理的重複程式碼。

那麼具體怎麼處理呢,我先給出我的處理方式:

定義一個註解@Purview

import java.lang.annotation.*;
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Purview {

}
這個註解中什麼都不用寫,就是用來做切面標記的。

然後寫我們的Aspect:

import com.alibaba.fastjson.JSON;
import com.alipay.marketingservice.util.ConstantManager;
import com.alipay.opbiservice.common.Result;
import com.alipay.opbiservice.vo.UserVo;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; @Aspect
@Component public class PurviewAspect { private static final Logger LOGGER = LoggerFactory.getLogger(LogAspect.class); /** * 捕獲@Purview註解的方法,在方法執行前進行許可權判斷 */ @Before("@annotation(com.alipay.marketingservice.aspect.Purview)") public void doPurview(JoinPoint point) throws Throwable{ String clazz =point.getTarget().getClass().getName(); // 獲取目標物件上正在執行的方法名 String methodName =point.getSignature().getName(); LOGGER.info("開始許可權判斷:" + clazz + "類的" + methodName + "方法"); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); Result purview = checkPurview(request); if (null != purview) { throw new Exception("許可權不滿足"); } }
在此,對有@Purview註解的方法做一個許可權判斷,具體判斷方法私有化出來就可以了。

當然,也可以做一些其他操作,這裡就不做過多闡述了。

忙的一塌糊塗,這次就寫到這裡了。O(∩_∩)O~~