如何将 Oauth2 服务器正确设置为 Spring 现有 API?

Posted

技术标签:

【中文标题】如何将 Oauth2 服务器正确设置为 Spring 现有 API?【英文标题】:How to properly set Oauth2 servers into a Spring existing API? 【发布时间】:2017-07-07 12:05:29 【问题描述】:

我正在将 Oauth2 服务器实现到现有的 REST api 中,以向其中的某些部分添加安全性。 问题是:如果我没有在主类中声明ResourceServer和AuthorizationServer的@configuration,spring security不会加载配置,所以我无法访问API。

我想将此配置放在不同包中的外部类中,但我对 Spring 很陌生,找不到正确执行此操作的方法。

所以我的外部配置文件,如果他的内容在主类中就可以工作,但如果在外部文件中则不行:

SecurityConf.java

@RestController
@Configuration
public class Security 

@RequestMapping("/")
public String home() 
    return "Hello World";


@Configuration
@EnableResourceServer
protected static class ResourceServer extends ResourceServerConfigurerAdapter 

    @Override
    public void configure(HttpSecurity http) throws Exception 
        // @formatter:off
        http

            .authorizeRequests()
                            .antMatchers("/features/**").permitAll()
                            .antMatchers("/itineraries/**").permitAll()



            .anyRequest().access("#oauth2.hasScope('read')"); //This makes all other petitions under authorization

    

    @Override
    public void configure(ResourceServerSecurityConfigurer resources)
            throws Exception 
        resources.resourceId("sparklr");
    



@Configuration
@EnableAuthorizationServer
protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter 

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints)
            throws Exception 
        endpoints.authenticationManager(authenticationManager);
    

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception 
        // @formatter:off
        clients.inMemory().withClient("my-trusted-client")
                .authorizedGrantTypes("password", "authorization_code",
                        "refresh_token", "implicit")
                .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT")
                .scopes("read", "write", "trust").resourceIds("sparklr")
                .accessTokenValiditySeconds(60).and()
                .withClient("my-client-with-registered-redirect")
                 .authorizedGrantTypes("authorization_code").authorities("ROLE_CLIENT")
                .scopes("read", "trust").resourceIds("sparklr")
                .redirectUris("http://anywhere?key=value").and()
                .withClient("my-client-with-secret")
                .authorizedGrantTypes("client_credentials", "password")
                 .authorities("ROLE_CLIENT").scopes("read").resourceIds("sparklr")
                .secret("secret");
        // @formatter:on
    




还有主类,

Application.java

@Configuration
@EnableConfigurationProperties
@ComponentScan(basePackageClasses = SimpleCORSFilter.class)
@EnableAutoConfiguration
@EntityScan(basePackages = "com.pace.things.model")
public class Application 
    @Bean
    public FilterRegistrationBean filterRegistrationBean() 
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        registrationBean.setFilter(characterEncodingFilter);
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        registrationBean.setOrder(Integer.MIN_VALUE);
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    


    public static void main(String[] args) 
            SpringApplication application = new SpringApplication(Application.class);
    SpringApplication.run(Application.class, args);
    

那么我忘记了什么?

提前致谢

【问题讨论】:

我自己在这个other 线程上解决了这个问题。 【参考方案1】:

Referenced thread:

我需要将 WebSecurityConfig 添加到应用程序上下文中,在主类声明中添加这一行:

...
@Import(WebSecurityConfig.class)
public class Application   
...

我做的另一件事是将SpringBoot升级到1.4.3.RELEASE并将主应用程序放到根文件夹:

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
  </parent>

树将是,例如:

└── com
└── app
    ├── Application.java
    └── config
        └── WebSecurityConfig.java

这会自动加载子文件夹中的所有@Configuration

【讨论】:

以上是关于如何将 Oauth2 服务器正确设置为 Spring 现有 API?的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖 Spring Cloud OAuth2 客户端自动配置?

如何设置 OAuth2RestTemplate(更新后)

什么是正确的授权码 OAuth2 流程?

如何为 spring oauth2 jwt 服务器生成正确的 jwks 端点?

公共第一方客户端的正确 OAuth2 流程

如何限制 OAuth2 设置中定义的客户端访问?