自定义注解 检查权限
@Documented
@Retention ( RetentionPolicy . RUNTIME )
@Target ( { ElementType . TYPE , ElementType . METHOD } )
public @interface CheckPower { String api ( ) default "" ; String name ( ) default "" ; String remark ( ) default "" ;
}
切面类 定义切点和增强方法
@Component
@Aspect
public class CheckPowerAspect { @Resource private GetTokenUtil getTokenUtil; @Resource private RedisService redisService; @Autowired private ThreadService threadService; @Resource private SkyPowerListMapper powerListMapper; @Pointcut ( "@annotation(com.example.sky_world.annotation.CheckPower)" ) private void pointcut ( ) { } @Around ( "pointcut() && @annotation(cp)" ) public Object advice ( ProceedingJoinPoint jp, CheckPower cp) { ResultVoUtils proceed = new ResultVoUtils ( ) ; try { String requestApi = cp. api ( ) ; String name = cp. name ( ) ; String remark = cp. remark ( ) ; threadService. insertPowerList ( requestApi, name, remark) ; Object [ ] args = jp. getArgs ( ) ; HttpServletRequest request = ( HttpServletRequest ) args[ 0 ] ; String token = getTokenUtil. getToken ( request) ; SkyUserPower skyUserPower = ( SkyUserPower ) redisService. getObject ( token) ; if ( skyUserPower == null ) { return new ResultVoUtils ( ResponseCode . ERROR3 . getCode ( ) , "登陆超时,请重新登录" ) ; } if ( skyUserPower. getSuperadmin ( ) != null ) { redisService. setTimeOutToken ( token, skyUserPower) ; proceed = ( ResultVoUtils ) jp. proceed ( ) ; return proceed; } if ( token == null || "0" . equals ( token) ) { redisService. setDbIndex ( 1 ) ; Map < String , String > GuestPowerMap = ( Map < String , String > ) redisService. getHash ( "group0" ) ; redisService. setDbIndex ( 0 ) ; for ( String apiPath : GuestPowerMap . keySet ( ) ) { if ( apiPath. equals ( requestApi) ) { proceed = ( ResultVoUtils ) jp. proceed ( ) ; return proceed; } else { return new ResultVoUtils ( ResponseCode . ERROR3 . getCode ( ) , "没有权限!" ) ; } } } Map < String , String > powerMap = skyUserPower. getPowerMap ( ) ; for ( String apiPath : powerMap. keySet ( ) ) { if ( apiPath. equals ( requestApi) ) { redisService. setTimeOutToken ( token, skyUserPower) ; proceed = ( ResultVoUtils ) jp. proceed ( ) ; return proceed; } } } catch ( Throwable e) { e. printStackTrace ( ) ; if ( proceed. getCode ( ) != 0 ) { return proceed; } return new ResultVoUtils ( ResponseCode . ERROR3 . getCode ( ) , "获取权限异常,请重试!" ) ; } return new ResultVoUtils ( ResponseCode . ERROR3 . getCode ( ) , "没有权限!" ) ; }
}
前端控制器
@CheckPower ( api = "sky-article-list_queryArticle" , name = "文章:根据id查询文章" , remark = "根据id查询文章" ) @PostMapping ( "/queryArticle" ) public ResultVoUtils queryArticleByIds ( HttpServletRequest request) throws IOException { String token = GetTokenUtil . getToken ( request) ; byte [ ] bytes = StreamUtils . copyToByteArray ( request. getInputStream ( ) ) ; String s = new String ( bytes, request. getCharacterEncoding ( ) ) ; JSONObject jsonObject = JSONObject . fromObject ( s) ; String ids = ( String ) jsonObject. get ( "ids" ) ; return skyArticleListService. selectSkyArticleList ( ids, token) ; }
Redis
public void setTimeOutUserPowerMap ( String key, Map powerMap) { redisTemplate. opsForHash ( ) . putAll ( key, powerMap) ; redisTemplate. expire ( key, params. getTimetoken ( ) , TimeUnit . HOURS ) ; }