zoukankan      html  css  js  c++  java
  • spring security 核心切面

    
    import org.aopalliance.intercept.MethodInterceptor;
    import org.apache.commons.collections.CollectionUtils;
    import org.springframework.aop.support.StaticMethodMatcherPointcutAdvisor;
    
    import java.lang.reflect.Method;
    import java.util.HashSet;
    import java.util.LinkedHashSet;
    import java.util.Set;
    
    /**
     * Authorize切点
     **/
    public class AopAuthorizeAdvisor extends StaticMethodMatcherPointcutAdvisor {
    
        public static final String THREAD_LOCAL_AUTH_CONTEXT = "authContext";
    
        public AopAuthorizeAdvisor(AuthorizeService authorizeService) {
            super((MethodInterceptor) methodInvocation -> {
                MethodInterceptorHolder holder = MethodInterceptorHolder.create(methodInvocation);
                MethodInterceptorContext paramContext = holder.createParamContext();
    
                Authentication authentication = Authentication.current().orElseThrow(UnauthorizedException::new);
    
                AuthContext context = new AuthContext(authentication, paramContext);
                ThreadLocalUtil.put(THREAD_LOCAL_AUTH_CONTEXT, context);
                authorizeService.handle(context);
    
                Set<String> tempIncludes = new HashSet<>();
                Set<String> tempExcludes = new HashSet<>();
    
                paramContext.getParameter(Param.class).ifPresent(
                        param -> {
                            tempIncludes.addAll(param.getIncludes());
                            tempExcludes.addAll(param.getExcludes());
                        }
                );
    
                Object obj = methodInvocation.proceed();
                ThreadLocalUtil.remove(THREAD_LOCAL_AUTH_CONTEXT);
                if (obj != null && obj instanceof ResponseMessage) {
                    ResponseMessage responseMessage = (ResponseMessage) obj;
                    if (CollectionUtils.isNotEmpty(tempIncludes)) {
                        // 设置可以显示的字段
                        responseMessage.setFields(new LinkedHashSet<>(CollectionUtils.removeAll(tempIncludes, tempExcludes)));
                    } else {
                        responseMessage.setFields(new LinkedHashSet<>());
                    }
                }
                return obj;
            });
        }
    
        @Override
        public boolean matches(Method method, Class<?> aClass) {
            //对controller进行控制, 只判断类, 或者父类上是否有Authorize标签.
            return ClassUtil.getAnnotation(aClass, Authorize.class) != null;
        }
    }
    
    
        @Bean
        public AuthenticationSupplier authenticationSupplier() {
            return () -> {
                if (SecurityContextHolder.getContext().getAuthentication() == null) {
                    return null;
                } else {
                    Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
                    if (principal == null) {
                        return null;
                    } else {
                        return principal instanceof AuthUserDetails ? ((AuthUserDetails)principal).getAuthentication() : null;
                    }
                }
            };
        }
    
  • 相关阅读:
    全球化编码
    linuxGrep命令
    Xcode-插件所在路径
    多控制器间数据传递
    触摸事件
    IOS事件处理
    事件监听的三种方法
    UITabBarController
    聊天布局
    Info.plist:项目配置文件
  • 原文地址:https://www.cnblogs.com/liuyupen/p/14009238.html
Copyright © 2011-2022 走看看