如何在春季授权服务器中允许端点?

Posted

技术标签:

【中文标题】如何在春季授权服务器中允许端点?【英文标题】:How to permit endpoints in spring authorization server? 【发布时间】:2020-04-18 02:52:47 【问题描述】:

我有一个 spring boot oauth2 授权服务器,它将提供和授权令牌。我还想为用户创建提供端点。您能告诉我如何允许未经身份验证的用户使用这些端点吗?我尝试了以下配置:

@Configuration
@EnableAuthorizationServer
@RequiredArgsConstructor
public class AuthorizationConfig extends AuthorizationServerConfigurerAdapter 

    private TokenStore tokenStore = new InMemoryTokenStore();

    private final UserDetailsService userDetailsServiceImpl;

    private final AuthenticationManager authenticationManager;

    private final PasswordEncoder passwordEncoder;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception 

        // TODO persist clients details

        clients.inMemory()
                .withClient("browser")
                .authorizedGrantTypes("refresh_token", "password")
                .scopes("ui");
    

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception 
        endpoints
                .tokenStore(tokenStore)
                .authenticationManager(authenticationManager)
                .userDetailsService(userDetailsServiceImpl);
    

    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception 
        oauthServer
                .tokenKeyAccess("permitAll()")
                .checkTokenAccess("isAuthenticated()")
                .passwordEncoder(passwordEncoder);
    

和授权服务器配置:

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class WebSecurityConfig extends WebSecurityConfigurerAdapter 

    private final UserDetailsService userDetailsServiceImpl;

    @Bean
    PasswordEncoder passwordEncoder() 
        return new BCryptPasswordEncoder();
    

    @Override
    public void configure(HttpSecurity http) throws Exception 
        http
                .authorizeRequests(authorizeRequests -> 
                    authorizeRequests
                            .antMatchers(HttpMethod.POST, "/user/**").permitAll()
                            .anyRequest().authenticated();
                );
    

    @Bean(name = "authenticationManager")
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception 
        return super.authenticationManagerBean();
    

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

这是我想要允许的端点:

@RestController
@RequestMapping(path = "/user")
@RequiredArgsConstructor
public class UserController 

    private final UserService userService;

    @PostMapping
    public UUID create(@RequestBody UserDto userDto) 
        return userService.create(userDto);
    

通过这些配置,我总是得到响应:


    "timestamp": "2019-12-28T16:01:09.135+0000",
    "status": 403,
    "error": "Forbidden",
    "message": "Forbidden",
    "path": "/user"

我正在使用spring boot 2。谢谢您的建议。

【问题讨论】:

【参考方案1】:

您需要在 AuthorizationConfig 类中禁用 CSRF。试试这个配置:

http.authorizeRequests(authorizeRequests -> 
        authorizeRequests
                .antMatchers(HttpMethod.POST, "/user/**").permitAll()
                .anyRequest().authenticated();
    ).csrf(csrf -> 
        csrf.disable();
    );

有关 CSRF 的更多信息,请查看此网站:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF). 基本上,您不想允许任何人在您的网站上发布信息,因此只有当用户可以提供表明他正在使用您的网站进行发布的令牌(该令牌由您的服务器提供)时,您才允许发布。现在在许多 Web 应用程序中,您可以禁用它,因为您从许多位置发布...但不要忘记您网站的安全性。

【讨论】:

以上是关于如何在春季授权服务器中允许端点?的主要内容,如果未能解决你的问题,请参考以下文章

路径不适用于 Blazor 中允许的 IdentityServer CORS 端点,但适用于 Postman

如何在无服务器中允许 CORS 用于自定义标头?

如何在 Glassfish 中允许该权限

如何在apache2中允许放置方法

如何在php中允许有限大小的文件上传?

如何在旧版本的放心中允许自签名 SSL 证书