当前位置: 首页 > 知识库问答 >
问题:

Spring Security OAuth2,哪个决定安全性?

司马彬
2023-03-14

我一直试图使用Dave Syer的指南实现一个OAuth2身份验证服务器,并从Jhipster获得一些启发。但我不知道这一切是怎么一起工作的。

使用ResourceServerConfigurerAdapter时,使用WebSecurityConfigurerAdapter的安全设置似乎被覆盖。

@Configuration
@EnableResourceServer
public class OAuth2ResourceConfig extends ResourceServerConfigurerAdapter {

    private TokenExtractor tokenExtractor = new BearerTokenExtractor();

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
                .addFilterAfter(contextClearer(), AbstractPreAuthenticatedProcessingFilter.class)
                .authorizeRequests()
                .anyRequest().authenticated().and().httpBasic();
    }

    private OncePerRequestFilter contextClearer() {
        return new OncePerRequestFilter() {
            @Override
            protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
                if (tokenExtractor.extract(request) == null) {
                    SecurityContextHolder.clearContext();
                }
                filterChain.doFilter(request, response);
            }
        };
    }

@Component
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

    private final AuthenticationManager authenticationManager;

    @Autowired
    public CustomWebSecurityConfigurerAdapter(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .parentAuthenticationManager(authenticationManager);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .formLogin()
                    .loginPage("/login").permitAll()
                .and()
                    .authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                .and()
                    .requestMatchers().antMatchers("/login", "/oauth/authorize", "/oauth/confirm_access")
                .and()
                    .authorizeRequests().anyRequest().authenticated();
    }
}

这是取自几个不同示例的代码,所以它们可能不能很好地混合在一起。但是我找不到一个好的OAuth2文档/示例列表(不像Spring Boot有一个很棒的文档),所以我很难理解这些文档是如何结合在一起的。如果我不将LogInformation添加到ResourceServerConfigurerAdapter,它只会给我未经授权的信息。但是我在WebSecurityConfigurererAdapter中将其定义为permitAll()。

这是AuthorizationServerConfigurerAdapter:

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private JwtAccessTokenConverter jwtAccessTokenConverter;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("acme")
                .secret("acmesecret")
                .authorizedGrantTypes("authorization_code", "refresh_token",
                        "password").scopes("openid");
    }

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

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

如果有人知道任何指南、教程、博客或任何类似的东西,可以帮助我围绕这是如何工作的,那将是非常感谢的。

问候你,肯尼斯。

共有1个答案

徐友樵
2023-03-14

您需要WebSecurityConfigurerAdapter来保护/Authorizeendpoint,并为用户提供身份验证的方法。Spring Boot应用程序可以为您完成这项工作(通过添加自己的WebSecurityConfigurerAdapter,并使用HTTP basic auth)。默认情况下,它创建order=0的筛选器链,并保护所有资源,除非提供请求匹配器。@enableResourceServer执行类似的操作,但是它添加的筛选器链默认为Order=3。WebSecurityConfigurerAdapter有一个@Order(100)注释。因此,首先将检查ResourceServer(身份验证),然后将检查WebSecurityConfigureAdapter的Enx张力中的检查。

您的配置看起来很正常(登录链优先,但只匹配一小部分请求)。

 类似资料:
  • 问题内容: 我一直在尝试使用Dave Syer的指南来实现OAuth2身份验证服务器,并从JHipster获得一些启发。但是我无法弄清楚它们如何协同工作。 当我使用ResourceServerConfigurerAdapter时,使用WebSecurityConfigurerAdapter的安全设置似乎被覆盖。 这是摘自几个不同示例的代码,因此它们可能混合得不好。但是我找不到OAuth2的良好文档

  • 基本思想是用户会话应该很长,并且根据用户活动继续/禁用。然而,由于我们不能撤销令牌,所以令牌应该是短期的,比如15分钟。如果我们可以在令牌过期后刷新令牌,那么用户会话可以继续。 经过一些研究,我发现有两种实现: 一个用于刷新过期,一个用于令牌过期。刷新TTL比令牌到期TTL长。如果客户端发现当前令牌已过期但仍可以刷新,则将调用服务器刷新api。新令牌将有新的到期时间和刷新到期时间。如果两个TTL都

  •  安全性设定 调整PSP™安全性的加密设定。 变更密码 视听年龄限制 网络浏览接口启动限制

  • 问题内容: 我有两个SQL查询,其中每次调用时我都尝试用+1和-1分别更新和值。 第一个查询: 第二查询 因为与我交换而在第二次注射查询中有任何威胁吗? 问题答案: 不,第二个查询与第一个查询一样安全,因为它已完全参数化,因此没有提供外部数据可以通过其输入SQL查询本身文本的路径。该表达式是由RDBMS计算的,而不是由程序*计算的,因此它不能提供将新代码注入现有SQL的机会。 *,并且随后不会提供

  • 问题内容: 用户可以控制的任何变量,攻击者也可以控制,因此是攻击的源头。这称为“污染”变量,并且不安全。 使用时,可以控制许多变量。,,,和许多其它的是由客户端发送的HTTP请求报头的一部分。 有人知道“安全列表”或变量列表吗? 问题答案: 就没有这样的“安全”或“不安全”值。只有服务器控制的值和用户控制的值,您需要知道值的来源,因此是否可以出于特定目的信任该值。例如,将其存储在数据库中是完全安全

  • 在过去的三天里,我一直在学习生命周期主题,现在它们对我来说开始有意义了。然而,我做了很多实验,但没有设法以一种会导致运行时不安全行为的方式指定生命周期,因为编译器似乎足够聪明,可以通过不编译来防止此类情况。因此我有以下问题链: Rust编译器会抓住每一个使用不安全生命周期说明符的情况,这是真的吗? 如果是的话,那么为什么Rust需要手动指定生命周期,而它可以通过推断不安全的场景来自行指定生命周期?