如何在我的 Spring Boot Security OAuth2 应用程序中仅为某些类启用 OAuth2?

Posted

技术标签:

【中文标题】如何在我的 Spring Boot Security OAuth2 应用程序中仅为某些类启用 OAuth2?【英文标题】:How do I enable OAuth2 for only certain classes in my Spring Boot Security OAuth2 app? 【发布时间】:2018-10-29 11:19:32 【问题描述】:

我按照本指南添加 OAuth2

https://spring.io/guides/tutorials/bookmarks/#_securing_a_rest_service

但现在它要求对每个页面进行身份验证!

$ curl -s http://localhost:8080/login 
"error":"unauthorized","error_description":"Full authentication is required to access this resource"

我只想在一个特定类的 API 上使用 OAuth2。我尝试阅读 Spring Boot 的参考

https://docs.spring.io/spring-boot/docs/1.5.14.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-security

但这根本没有帮助!它给出了 0 个例子。

要自定义它,您通常使用 WebSecurityConfigurerAdapter 类型的外部属性和 bean(例如,添加基于表单的登录)。 以上所有内容都可以使用外部属性(security.*)打开和关闭或修改。要覆盖访问规则而不更改任何其他自动配置的功能,请添加类型为 WebSecurityConfigurerAdapter 的 @Bean 和 @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 并对其进行配置以满足您的需求。

如何自定义它?! 哪些属性?! 如何您如何配置以满足您的需求?!

我尝试设置application.properties

security.basic.enabled = false
security.ignored = /login

但它仍然需要 OAuth2 身份验证。我只想为 IShortUrlApiInteface 类启用 OAuth2,并为所有其他 @Controllers 禁用它。

【问题讨论】:

显示你的资源服务器配置。 这里是@EnableResourceServer 类。 gist.github.com/starrychloe/7289fcb52d882ec4b084a994d75ebc3d 您没有配置安全性,因此默认情况下所有 URL 都是安全的。 是的,当我问这个问题时我就知道了,那么如何仅为某些类启用 OAuth2? 这是@EnableResourceServer 类。 那是您的授权服务器类。您的资源服务器需要第二个类。 【参考方案1】:

创建一个类,扩展ResourceServerConfigurerAdapter,并覆盖方法configure(HttpSecurity)

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter 

    String [] ignoredPaths = new String[]
            "/robots.txt", "/error", "/login", "/doLogut", "/home", "/pageNotFound", 
            "/css/**", "/js/**", "/fonts/**", "/img/**", ...
    ;

    @Override
    public void configure(HttpSecurity http) throws Exception

        http.authorizeRequests()
            .antMatchers(ignoredPaths).permitAll()
            .anyRequest().authenticated()
        .and()
            .httpBasic();   
    

【讨论】:

好的,但是您可以从指南中看到没有configure(HttpsSecurity) 方法。尽管如此,我尝试添加您的方法,但 IDE 给出了错误:The method configure(HttpSecurity) of type OAuth2Configuration must override or implement a supertype method。这不可能是答案。不过,我创建了@EnableResourceServer public class ResourceServerConfig extends ResourceServerConfigurerAdapter,添加了您的方法,现在 nothing 受到保护! curl -i -X POST -H "Content-Type: application/json" -H "Authorization: Bearer bad-token" localhost:8080/isTagAvailableHTTP/1.1 200. 好的,我让它工作并编辑了你的答案。难以置信它是多么简单。我尝试了configure(HttpSecurity)WebSecurityConfigurerAdapter 的数千种变体,但它会弄乱一切并给出极其奇怪的错误,并且无法调试。仅仅是该类的存在就破坏了应用程序和路径!【参考方案2】:

在您的情况下,您需要设置登录 URI 的权限。 如果您在微服务架构中,则需要在每个项目/服务中创建资源配置。

security.oauth2.resource.user-info-uri 定义授权服务 URI clientId 定义了你的实际客户 ID

在 oauth 中,对于每个资源服务器都需要创建唯一的资源 ID 下面是资源服务器的示例。

@配置 @EnableResourceServer 公共类 ResourceConfig 扩展 ResourceServerConfigurerAdapter @Value("$security.oauth2.resource.user-info-uri") 私有字符串 userInfoUri;

@Value("$client-id")
private String clientId;

@Override
public void configure(final ResourceServerSecurityConfigurer resources) throws Exception 
    resources.resourceId("ig-user");


@Override
public void configure(final HttpSecurity http) throws Exception 
    http.authorizeRequests().antMatchers("/api/v1/user/activate/**").permitAll()//
            .antMatchers("/api/v1/user/access/check/**").permitAll()//
            .antMatchers("/api/v1/profile/exists/**").permitAll()//
            .antMatchers("/api/v1/user/sign-up/**").permitAll()//
            .antMatchers("/download/**").permitAll()//
            .anyRequest().authenticated();


@Primary
@Bean
public UserInfoTokenServices tokenService() 
    final UserInfoTokenServices tokenService = new UserInfoTokenServices(userInfoUri, clientId);
    return tokenService;

【讨论】:

那甚至没有初始化。 Application startup failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'resourceServerConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'security.oauth2.resource.user-info-uri' in value "$security.oauth2.resource.user-info-uri" 看看,如何使用'@value'注解!!然后它会工作

以上是关于如何在我的 Spring Boot Security OAuth2 应用程序中仅为某些类启用 OAuth2?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 Spring Boot 应用程序中从 AWS 访问环境变量

如何在我的 Maven Spring Boot 多模块项目的测试中引用兄弟模块?

@Transactional 在我的 Spring Boot 应用程序中无效

如何让世界各地的每个人都可以访问在我的计算机上启动的 Spring Boot 应用程序? [关闭]

如何在我的 Spring Boot Security OAuth2 应用程序中仅为某些类启用 OAuth2?

如何使用hibernate在spring boot中实现分页