gpt4 book ai didi

spring - 自定义 http 安全配置以及 OAuth2 资源服务器

转载 作者:行者123 更新时间:2023-12-04 19:01:41 25 4
gpt4 key购买 nike

我正在使用 Spring Security OAuth2具有非常基本的配置,可以正常工作。我现在想要一个单独的 WebSecurityConfigurerAdapter包含确定某人是否有权访问某些端点的自定义逻辑。但是,无论我尝试什么,它都不会执行。以下是我的 OAuth2配置和我对这个主题的发现。授权服务器:

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

@Autowired
private TokenStore tokenStore;

@Autowired
private AuthenticationManagerBuilder authenticationManager;

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)throws Exception {
endpoints.authenticationManager(authentication -> authenticationManager.getOrBuild().authenticate(authentication)).tokenStore(tokenStore);
}

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory().withClient("CLIENT_NAME")...;
}

}

资源服务器:
@Configuration
@EnableResourceServer
public class OAuth2ResourceServerConfig extends ResourceServerConfigurerAdapter {

@Autowired
private TokenStore tokenStore;

@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated();
}

@Override
public void configure(final ResourceServerSecurityConfigurer resources) throws Exception {
resources.tokenStore(tokenStore);
}
}

到现在为止还挺好。当定制 WebSecurityConfigurerAdapter开始行动,但我开始遇到问题。自 EnableResourceServer -annotated bean 创建一个 WebSecurityConfigurerAdapterOrder(3)它首先在每个请求上执行,用户成功通过身份验证/授权,但我的自定义逻辑 WebSecurityConfiguration不被执行。另一方面,如果我设置 WebSecurityConfiguration有一个 Order(2)或更少,自定义 access规则被执行,但它总是说它们来自匿名用户(因为由 @EnableResourceServer 创建的 bean 中的规则没有被执行)。
@EnableWebSecurity
@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

@Bean
public TokenStore tokenStore() {
return new InMemoryTokenStore();
}

@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/...");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();

http.authorizeRequests().antMatchers(HttpMethod.GET, "/path/**")
.access("@security.hasPermission(authentication, 'SOME', 'VALUE')");

http.authorizeRequests().anyRequest().authenticated();
}
}

作为旁注, @security access 中的引用rules 只是一个简单的命名 Spring bean:
@Component("security")
public class SecurityService {
public boolean hasPermission(Authentication authentication, String param, String anotherParam) { ... }
}

我有集成测试来验证 WebSecurityConfiguration 中的自定义访问规则它们可以工作(因为我跳过了那里的身份验证)。我希望能够仅使用资源服务器进行身份验证,然后使用我的自定义 http 安全进行授权。

最佳答案

上面的代码有两件事,第一,你应该给客户端分配一些权限。

这里有一些代码这样做:

在 OAuth2AuthorizationServerConfig 你应该改变这个

clients.inMemory().withClient("CLIENT_NAME").authorities("ADMIN")....;

在匹配器中你应该做
 http.authorizeRequests().antMatchers(HttpMethod.GET, "/path/**")
.hasAuthority("ADMIN");

或者您可以为安全方法/ Controller 添加注释
 @PreAuthorize("hasAuthority('ADMIN')")

关于spring - 自定义 http 安全配置以及 OAuth2 资源服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36233910/

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