gpt4 book ai didi

java - SpringBoot 1.5.x + 安全性 + OAuth2

转载 作者:搜寻专家 更新时间:2023-10-30 21:03:42 24 4
gpt4 key购买 nike

我有一个带有 OAuth2 安全性的 Spring Boot REST API。

今天,我将 spring-boot-starter-parent 的版本从 1.4.2 升级到了 1.5.2

变化让我完全困惑。

以前,我可以使用 Postman 测试我的 REST API。当我的访问 token 不正确或者我没有特定资源的权限时,服务器响应如下:

{
"error": "access_denied",
"error_description": "Access is denied"
}

现在它一直将我重定向到 /login 页面...当我登录时 - 它显示我的资源而没有任何 OAuth2 身份验证...

我试图禁用它,我发现了这个神奇的属性:

security.oauth2.resource.filter-order = 3

这一行关闭了重定向到登录页面。

但是,我的问题是:

  • 这两个版本之间在安全方面发生了什么?
  • 这条“奇怪”的线是唯一有效的修复吗?
  • 这个登录页面的目的是什么,它使用什么身份验证(我检查了谷歌浏览器中的请求和响应,但我看不到任何访问 token 和 oauth2 东西,所以它只使用用户存储库?)

我的代码中一些更重要的部分:

pom.xml

<!--- .... -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<properties>
<!--- .... -->
<spring-security-oauth.version>2.1.0.RELEASE</spring-security-oauth.version>
<!--- .... -->
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Monitor features -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
</dependency>
<!-- Security + OAuth2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
<version>${spring-security-oauth.version}</version>
</dependency>
<!--- .... -->

application.properties

#other properties
security.oauth2.resource.filter-order = 3

OAuth2.java

public class OAuth2 {
@EnableAuthorizationServer
@Configuration
@ComponentScan
public static class AuthorizationServer extends AuthorizationServerConfigurerAdapter {

@Autowired
private AuthenticationManager authenticationManagerBean;
@Autowired
private UserDetailsService userDetailsService;

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("trusted_client")
.authorizedGrantTypes("password", "refresh_token")
.scopes("read", "write");
}

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManagerBean).userDetailsService(userDetailsService);
}

@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security.allowFormAuthenticationForClients();
}
}

@EnableResourceServer
@Configuration
@ComponentScan
public static class ResourceServer extends ResourceServerConfigurerAdapter {

@Autowired
private RoleHierarchy roleHierarchy;

private SecurityExpressionHandler<FilterInvocation> webExpressionHandler() {
DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
defaultWebSecurityExpressionHandler.setRoleHierarchy(roleHierarchy);
return defaultWebSecurityExpressionHandler;
}

@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests().expressionHandler(webExpressionHandler())
.antMatchers("/api/**").hasRole("DEVELOPER");
}
}
}

安全.java

@EnableWebSecurity
@Configuration
@ComponentScan
public class Security extends WebSecurityConfigurerAdapter {

@Autowired
private UserDetailsService userDetailsService;

@Bean
public JpaAccountDetailsService userDetailsService(AccountsRepository accountsRepository) {
return new JpaAccountDetailsService(accountsRepository);
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}

@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}

@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}

最佳答案

好的,我现在明白了。

@Cleto Gadelha 向我指出了非常有用的信息。

但是我认为发行说明很不清楚或者遗漏了一些信息。除了 OAuth2 资源过滤器从 3 更改为 SecurityProperties.ACCESS_OVERRIDE_ORDER - 1 之外,关键信息是默认的 WebSecurityConfigurerAdapter 顺序为 100 (source) .

因此,在 1.5.x 版本之前,OAuth2 资源服务器顺序是 3,它具有更高优先级,然后 WebSecurityConfigurerAdapter

发布 1.5.x 后,OAuth2 资源服务器顺序设置为 SecurityProperties.ACCESS_OVERRIDE_ORDER - 1(我认为是 Integer.MAX_VALUE - 8)现在肯定较低优先级然后基本 WebSecurityConfigurerAdapter 顺序。

这就是从 1.4.x 迁移到 1.5.x 后为我显示登录页面的原因

因此,更优雅和类 java 风格的解决方案是在 WebSecurityConfigurerAdapter 类上设置 @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)

关于java - SpringBoot 1.5.x + 安全性 + OAuth2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42822875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com