gpt4 book ai didi

java - Spring OAuth2 资源仅允许客户端和 token 自动创建

转载 作者:太空宇宙 更新时间:2023-11-04 14:12:29 25 4
gpt4 key购买 nike

我有一个应用程序使用OAuth2 密码 授权类型来管理用户对其资源的授权。所有应用程序资源仅允许具有一次提供 token 的客户端访问,以代表某个用户执行操作,除了创建用户的 URI,我希望只有经过身份验证的客户端才能访问它。我使用 spring-security-oauth2 作为我的 OAuth 实现,但无法弄清楚如何以比下面描述的方式更简单的方式来完成此任务:

POST/users 仅可由经过身份验证的客户端访问。

目前,我通过删除 @EnableAuthorizationServer 并创建一个新类并扩展 AuthorizationServerSecurityConfiguration 类和重写方法来弄清楚如何做到这一点:configure( HttpSecurity http ) 并创建一个新的 @Configuration 类和 @Import AuthorizationServerEndpointsConfigurationCustomAuthorizationServerSecurityConfiguration。问题是,在我的新自定义 class 中,我需要重写整个方法原始代码并将其复制/粘贴到重写的方法中,以类似以下内容结尾:


@覆盖
protected void configure( HttpSecurity http ) 抛出异常 {
AuthorizationServerSecurityConfigurer 配置器 = new AuthorizationServerSecurityConfigurer();
FrameworkEndpointHandlerMapping handlerMapping = endpoints.oauth2EndpointHandlerMapping();
http.setSharedObject(FrameworkEndpointHandlerMapping.class, handlerMapping);
配置(配置器);
http.apply(配置器);
String tokenEndpointPath = handlerMapping.getServletPath("/oauth/token");
String tokenKeyPath = handlerMapping.getServletPath("/oauth/token_key");
String checkTokenPath = handlerMapping.getServletPath("/oauth/check_token");
http
.authorizeRequests()
.antMatchers(tokenEndpointPath).completeAuthenticated()
.antMatchers( HttpMethod.POST, "/users/**").completeAuthenticated()
.antMatchers(tokenKeyPath).access(configurer.getTokenKeyAccess())
.antMatchers(checkTokenPath).access(configurer.getCheckTokenAccess())
。和()
.requestMatchers()
.requestMatchers( 新 AntPathRequestMatcher(tokenKeyPath),
新的 AntPathRequestMatcher(tokenEndpointPath),
新的 AntPathRequestMatcher(checkTokenPath),
new AntPathRequestMatcher("/users/**", HttpMethod.POST.name()));
http.setSharedObject(ClientDetailsS​​ervice.class, clientDetailsS​​ervice);
}
我的第一个问题是,有更好的方法吗?

我想做的第二件事是在创建新用户时(在 URI POST/users 中)通过密码授予类型自动创建 AccessToken,但我无法计算出任何方法来做到这一点。

有人可以提供有关这两个需求的任何见解吗?

谢谢

最佳答案

不确定这是否是您要问的,但我知道您想要 使用 POST 方法为/users 端点上的请求配置特定的安全约束。所以 这就是我要做的。我不认为扩展 AuthorizationServerSecurityConfiguration 是必要的,因为推荐的方式 通常是在你的 main 中扩展 WebSecurityConfigurerAdapter 安全配置类,请记住,您可以为多个端点多次配置 HttpSecurity,但如果您在多个位置配置相同的端点,则最后读取的配置将是 Activity 的配置

           @EnableWebSecurity public class SecurityConfiguration extends
WebSecurityConfigurerAdapter {
//other methods ...

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

@Order(1)
@Override
protected void configure(HttpSecurity http) throws Exception {
//configure your path here
//I purposly configured GET user to
// permit all to see diference
//for example
// @formatter:off
http
.authorizeRequests()
.antMatchers(HttpMethod.GET,"/user")
.permitAll()
.antMatchers(HttpMethod.POST,"/user")
.fullyAuthenticated()
.and().csrf().disable()
.formLogin();
// @formatter:on
}

}

然后在您的 Ouath 配置中

@Configuration
public class OAuth2ServerConfiguration {

private static final String RESOURCE_ID = "restservice";

@Configuration
@EnableResourceServer
protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

@Override
public void configure(ResourceServerSecurityConfigurer resources) {
// @formatter:off
resources
.resourceId(RESOURCE_ID);
// @formatter:on
}

@Override
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.requestMatchers()
.antMatchers("/resources/**","/greeting")
.and()
.authorizeRequests()
.antMatchers("/resources").access("#oauth2.hasScope('read') or hasRole('ROLE_USER')")
.antMatchers("/greeting").access("#oauth2.hasScope('read')");
}
}

@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

private TokenStore tokenStore = new InMemoryTokenStore();

@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
// @formatter:off
endpoints
.tokenStore(this.tokenStore)
.authenticationManager(authenticationManager);
// @formatter:on
}

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
// @formatter:off
clients
.inMemory()
.withClient("clientapp")
.authorizedGrantTypes("password","refresh_token")
.authorities("USER")
.scopes("read", "write")
.resourceIds(RESOURCE_ID)
.secret("123456");
// @formatter:on

}

@Bean
@Primary
public DefaultTokenServices tokenServices() {
DefaultTokenServices tokenServices = new DefaultTokenServices();
tokenServices.setSupportRefreshToken(true);
tokenServices.setTokenStore(this.tokenStore);
return tokenServices;
}

}

}

正如您在上面所看到的,HttpSecurity 在扩展 WebSecurityConfigurerAdapter 的类中配置了两次,也在为您的 Ouath 配置扩展 ResourceServerConfigurerAdapter 的类中配置了两次

此示例的部分内容取自 royclarkson 的 gitHub 示例 https://github.com/royclarkson/spring-rest-service-oauth

我不确定你的第二个问题要问什么,你能澄清一下吗?

关于java - Spring OAuth2 资源仅允许客户端和 token 自动创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28144000/

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