@EnableOAuth2Sso - 如何保护/取消保护资源?
Posted
技术标签:
【中文标题】@EnableOAuth2Sso - 如何保护/取消保护资源?【英文标题】:@EnableOAuth2Sso - How to protect / unprotect resources? 【发布时间】:2015-08-10 02:25:06 【问题描述】:我正在尝试使用 Spring Cloud Security 中的 @EnableOAuth2Sso 功能。具体来说,我正在尝试使用 OAuth2 保护一些资源,同时让其他资源可以公开访问。我已经设法让它工作了,但我正在查看生成的代码,想知道是否有更清洁的方法。
我正在关注此处的文档:https://github.com/spring-cloud/spring-cloud-security/blob/master/src/main/asciidoc/spring-cloud-security.adoc 以及来自 Spring Boot 参考的类似指导。我有一个小代码示例来说明我的困境:https://github.com/kennyk65/oAuthSsoExample。
简而言之,我希望 localhost:8080/unprotected 资源公开可用,并且我希望 localhost:8080/protected 资源需要 OAuth2(通过 github,如配置)。我能够让基本的 OAuth2 行为正常工作,但导致 /unprotected 公开可用是有问题的。
首先,文档表明您可以只使用 OAuth2SsoConfigurer 的 match() 方法来指定要保护的资源。我发现这不起作用;当我尝试时,我得到一个 IllegalStateException 说至少需要一个映射。这似乎是指未实现的 configure(HttpSecurity) 方法。
接下来,我尝试在 configure(HttpSecurity) 中指定一个映射,指出“不受保护”的资源应该不受保护。但是,这会导致将 Http 基本安全性应用于该资源。奇怪的是,这会导致“受保护”资源完全公开!
// This results in “unprotected” being protected by HTTP Basic
// and “protected” being completely open!
@Configuration
protected static class OauthConfig extends OAuth2SsoConfigurerAdapter
@Override
public void match(RequestMatchers matchers)
matchers.antMatchers("/protected/**");
@Override
public void configure(HttpSecurity http) throws Exception
http
.authorizeRequests()
.antMatchers("/unprotected/**").permitAll();
一时兴起,我尝试故意添加应验证受保护资源的内容。这导致受保护的资源获得 OAuth2 保护(哇!),但未受保护的资源应用了 http 基本安全性(嗯?)。
// This results in “protected” being protected by OAuth 2
// and “unprotected” being protected by HTTP Basic, even though we say permitAll():
@Configuration
protected static class OauthConfig extends OAuth2SsoConfigurerAdapter
@Override
public void match(RequestMatchers matchers)
matchers.antMatchers("/protected/**");
@Override
public void configure(HttpSecurity http) throws Exception
http
.authorizeRequests()
.antMatchers("/protected/**”).authenticated();
.antMatchers("/unprotected/**").permitAll();
为了找到神奇的组合,我尝试使用 security.basic.enabled: false 简单地关闭 HTTP 基本身份验证。这奏效了(哇!),尽管我仍然对映射的问题感到有些困惑。
所以我想我的问题是,这是正确的吗?使用 OAuth 2 保护某些资源并不理会其他资源的最佳方法是什么?
【问题讨论】:
嗨,我看到你有类似的问题。我无法根据对您的帮助来解决它。我有 bean 学习你的课程云微服务,非常好。现在,在我从那里学到的东西之上,我正在使用 OAuth 构建安全性。你能否看看这个问题,也许你知道我错过了什么? ***.com/questions/38206714/… 【参考方案1】:如果您在/protected/**
上匹配,那么向/unprotected/**
添加访问规则是没有意义的(路径不匹配,因此永远不会应用该规则)。您需要为“未受保护”资源使用另一个过滤器链,或者为 SSO 提供更广泛的匹配。在前一种情况下,如果您不介意关闭它提供的安全性,那么您从 Spring Security 获得的默认值就可以了。例如。
@Configuration
protected static class OauthConfig extends OAuth2SsoConfigurerAdapter
@Override
public void match(RequestMatchers matchers)
matchers.antMatchers("/protected/**");
@Override
public void configure(HttpSecurity http) throws Exception
http
.authorizeRequests()
.antMatchers("/**”).authenticated();
并设置security.basic.enabled=false
。
【讨论】:
谢谢戴夫,这确实有效。虽然我对它为什么起作用感到困惑。我知道 http.authorizeRequests().antMatchers("/**").authenticated() 需要对任何请求进行身份验证,而不是允许对所有请求进行开放访问。我想我必须阅读 Spring Security 文档更多。感谢您的帮助。以上是关于@EnableOAuth2Sso - 如何保护/取消保护资源?的主要内容,如果未能解决你的问题,请参考以下文章
Spring security @EnableOAuth2Sso - 我们不能跳过开发环境的自签名 ssl 连接
@EnableOAuth2Sso 注释 OpenID Connect 是不是兼容?
@EnableOAuth2Sso 和 @EnableResourceServer 在同一个应用程序中
@ EnableOAuth2Sso时不支持请求方法'POST'
EnableEurekaClient 不能与 EnableOAuth2Sso 一起使用。它导致 springSecurityFilterChain bean AlreadyBuiltException