package com.central.gateway.config; import com.central.gateway.auth.*; import com.central.oauth2.common.properties.SecurityProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import org.springframework.security.authentication.ReactiveAuthenticationManager; import org.springframework.security.config.web.server.SecurityWebFiltersOrder; import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.oauth2.server.resource.web.server.ServerBearerTokenAuthenticationConverter; import org.springframework.security.web.server.SecurityWebFilterChain; import org.springframework.security.web.server.authentication.AuthenticationWebFilter; import org.springframework.security.web.server.authentication.ServerAuthenticationEntryPointFailureHandler; /** * 资源服务器配置 * * @author zlt * @date 2019/10/5 *

* Blog: https://zlt2000.gitee.io * Github: https://github.com/zlt2000 */ @Configuration public class ResourceServerConfiguration { @Autowired private SecurityProperties securityProperties; @Autowired private TokenStore tokenStore; @Autowired private PermissionAuthManager permissionAuthManager; @Bean SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { //认证处理器 ReactiveAuthenticationManager customAuthenticationManager = new CustomAuthenticationManager(tokenStore); JsonAuthenticationEntryPoint entryPoint = new JsonAuthenticationEntryPoint(); //token转换器 ServerBearerTokenAuthenticationConverter tokenAuthenticationConverter = new ServerBearerTokenAuthenticationConverter(); tokenAuthenticationConverter.setAllowUriQueryParameter(true); //oauth2认证过滤器 AuthenticationWebFilter oauth2Filter = new AuthenticationWebFilter(customAuthenticationManager); oauth2Filter.setServerAuthenticationConverter(tokenAuthenticationConverter); oauth2Filter.setAuthenticationFailureHandler(new ServerAuthenticationEntryPointFailureHandler(entryPoint)); oauth2Filter.setAuthenticationSuccessHandler(new Oauth2AuthSuccessHandler()); oauth2Filter.setRequiresAuthenticationMatcher(new CustomServerWebExchangeMatchers(securityProperties)); http.addFilterAt(oauth2Filter, SecurityWebFiltersOrder.AUTHENTICATION); ServerHttpSecurity.AuthorizeExchangeSpec authorizeExchange = http.authorizeExchange(); if (securityProperties.getAuth().getHttpUrls().length > 0) { authorizeExchange.pathMatchers(securityProperties.getAuth().getHttpUrls()).authenticated(); } if (securityProperties.getIgnore().getUrls().length > 0) { authorizeExchange.pathMatchers(securityProperties.getIgnore().getUrls()).permitAll(); } authorizeExchange .pathMatchers(HttpMethod.OPTIONS).permitAll() .anyExchange() .access(permissionAuthManager) .and() .exceptionHandling() .accessDeniedHandler(new JsonAccessDeniedHandler()) .authenticationEntryPoint(entryPoint) .and() .headers() .frameOptions() .disable() .and() .httpBasic().disable() .csrf().disable(); return http.build(); } }