spring oauth2和WebSecurity集成坑太多,留个笔记,以示后人...
PS:这个配置查了一天,酱油君也是醉了
交流请加页脚q群
对你有用,点击捐囎,求打赏
package com.auth2Server;
import com.auth2Server.config.AuthServerProperties;
import com.auth2Server.config.OAuth2FeignRequestInterceptor;
import com.auth2Server.model.entities.AppClientDetails;
import com.auth2Server.repository.AppRepository;
import com.auth2Server.sec.AjaxAuthFailHandler;
import com.auth2Server.sec.AjaxAuthSuccessHandler;
import com.auth2Server.sec.UnauthorizedEntryPoint;
import feign.RequestInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.oauth2.authserver.AuthorizationServerProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.oauth2.client.DefaultOAuth2ClientContext;
import org.springframework.security.oauth2.client.OAuth2RestTemplate;
import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsResourceDetails;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.*;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.ClientDetailsService;
import org.springframework.security.oauth2.provider.ClientRegistrationException;
/**
* @author Damon
* @create 2018-02-16 18:19
**/
@EnableOAuth2Client
@SpringBootApplication
@Slf4j
@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware")
@EnableConfigurationProperties({ AuthServerProperties.class })
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Configuration
@EnableAuthorizationServer
@EnableConfigurationProperties(AuthorizationServerProperties.class)
static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
/* @Autowired
ClientDetailsService clientDetailsService;*/
@Autowired
AppRepository appRepository;
@Autowired
private AuthenticationManager authenticationManager;
@Bean
ClientDetailsService getClientDetailsService(){
return clientId -> appRepository.findByAppId(clientId)
.map(AppClientDetails::new)
.orElseThrow(() -> new ClientRegistrationException("The given client is invalid " + clientId));
}
@Override
public void configure(final AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()").allowFormAuthenticationForClients();
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.withClientDetails(getClientDetailsService());
}
@Override
public void configure(final AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager);
}
}
@Configuration
@EnableResourceServer
@Order(6)
static class OAuth2ResourceConfig extends ResourceServerConfigurerAdapter {
@Bean
@ConfigurationProperties(prefix = "security.oauth2.client")
public ClientCredentialsResourceDetails clientCredentialsResourceDetails() {
return new ClientCredentialsResourceDetails();
}
@Bean
public RequestInterceptor oauth2FeignRequestInterceptor() {
return new OAuth2FeignRequestInterceptor(new DefaultOAuth2ClientContext(), clientCredentialsResourceDetails());
}
@Bean
public OAuth2RestTemplate clientCredentialsRestTemplate() {
return new OAuth2RestTemplate(clientCredentialsResourceDetails());
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.requestMatchers().antMatchers("/api/**")
.and()
.authorizeRequests()
.antMatchers("/api/**")
.authenticated()
.and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
@Configuration
@EnableWebSecurity
@Order(20)
static class webConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
private static final String[] AUTH_WHITELIST = {
"/swagger-resources/**",
"/swagger-ui.html",
"/v2/api-docs",
"/webjars/**",
"/upload/**"
};
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/style/**");
web.ignoring().antMatchers("/kaptcha/**");
web.ignoring().antMatchers("/payment/alipayNotify/**");
web.ignoring().antMatchers(AUTH_WHITELIST);
}
@Override
protected void configure(HttpSecurity http) throws Exception{
http
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.userDetailsService(userDetailsService)
.formLogin()
.successHandler(new AjaxAuthSuccessHandler())
.failureHandler(new AjaxAuthFailHandler())
.loginPage("/login").defaultSuccessUrl("/home").permitAll()
.and()
.exceptionHandling().authenticationEntryPoint(new UnauthorizedEntryPoint())
.and()
.logout().logoutUrl("/logout").logoutSuccessUrl("/login")
.and().csrf().disable();
}
}
}
引用:
https://segmentfault.com/a/1190000012260914
支付宝打赏
微信打赏