|
@@ -1,12 +1,20 @@
|
|
package com.chelvc.framework.security.config;
|
|
package com.chelvc.framework.security.config;
|
|
|
|
|
|
|
|
+import java.lang.reflect.Method;
|
|
|
|
+import java.util.Objects;
|
|
import javax.servlet.Filter;
|
|
import javax.servlet.Filter;
|
|
|
|
|
|
|
|
+import com.chelvc.framework.base.interceptor.StandardUnifiedResponseWrapper;
|
|
|
|
+import com.chelvc.framework.base.interceptor.UnifiedResponseWrapper;
|
|
|
|
+import com.chelvc.framework.security.annotation.Encrypt;
|
|
|
|
+import com.chelvc.framework.security.context.SecurityContextHolder;
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
import org.aopalliance.intercept.MethodInvocation;
|
|
import org.aopalliance.intercept.MethodInvocation;
|
|
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
|
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
|
import org.springframework.context.annotation.Bean;
|
|
import org.springframework.context.annotation.Bean;
|
|
import org.springframework.context.annotation.Configuration;
|
|
import org.springframework.context.annotation.Configuration;
|
|
import org.springframework.context.annotation.Primary;
|
|
import org.springframework.context.annotation.Primary;
|
|
|
|
+import org.springframework.core.MethodParameter;
|
|
import org.springframework.core.Ordered;
|
|
import org.springframework.core.Ordered;
|
|
import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler;
|
|
import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler;
|
|
import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler;
|
|
import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler;
|
|
@@ -16,6 +24,7 @@ import org.springframework.security.config.annotation.method.configuration.Globa
|
|
import org.springframework.security.core.Authentication;
|
|
import org.springframework.security.core.Authentication;
|
|
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
|
|
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
|
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
|
|
|
+import org.springframework.web.context.request.NativeWebRequest;
|
|
import org.springframework.web.cors.CorsConfiguration;
|
|
import org.springframework.web.cors.CorsConfiguration;
|
|
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
|
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
|
import org.springframework.web.filter.CorsFilter;
|
|
import org.springframework.web.filter.CorsFilter;
|
|
@@ -26,6 +35,7 @@ import org.springframework.web.filter.CorsFilter;
|
|
* @author Woody
|
|
* @author Woody
|
|
* @date 2023/4/5
|
|
* @date 2023/4/5
|
|
*/
|
|
*/
|
|
|
|
+@Slf4j
|
|
@Configuration
|
|
@Configuration
|
|
@EnableGlobalMethodSecurity(prePostEnabled = true)
|
|
@EnableGlobalMethodSecurity(prePostEnabled = true)
|
|
public class SecurityConfigurer extends GlobalMethodSecurityConfiguration {
|
|
public class SecurityConfigurer extends GlobalMethodSecurityConfiguration {
|
|
@@ -52,6 +62,27 @@ public class SecurityConfigurer extends GlobalMethodSecurityConfiguration {
|
|
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
|
|
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Bean
|
|
|
|
+ @Primary
|
|
|
|
+ public UnifiedResponseWrapper unifiedResponseWrapper() {
|
|
|
|
+ return new StandardUnifiedResponseWrapper() {
|
|
|
|
+ @Override
|
|
|
|
+ public Object wrap(NativeWebRequest request, MethodParameter method, Object value) {
|
|
|
|
+ // 判断方法返回值是否需要加密
|
|
|
|
+ Method target = Objects.requireNonNull(method.getMethod());
|
|
|
|
+ if (target.getReturnType() == String.class && target.isAnnotationPresent(Encrypt.class)) {
|
|
|
|
+ try {
|
|
|
|
+ value = SecurityContextHolder.encrypt((String) value);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ // 如果加密失败则回退到明文传输
|
|
|
|
+ log.error("Data encrypt failed: {}", e.getMessage());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return super.wrap(request, method, value);
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+
|
|
@Bean
|
|
@Bean
|
|
public FilterRegistrationBean<Filter> crossDomainAccessRegistration() {
|
|
public FilterRegistrationBean<Filter> crossDomainAccessRegistration() {
|
|
FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
|
|
FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
|