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

安全OAuth2单一签准

司徒瀚
2023-03-14

我有两个客户端(client1、client2)和一个OAuth(授权、资源)。

我想从一个客户端注销,另一个将注销。我已经尝试了这个Spring引导oauth2单登录关闭注销,但这只注销我的客户端1和客户端2仍然登录!

然后,当我使用下面的代码时,我尝试撤销我的令牌:

String username = principal.getName();
Collection<OAuth2AccessToken> accessTokens = tokenStore.findTokensByClientIdAndUserName("client1", username);
accessTokens.forEach(a -> tokenServices.revokeToken(a.getValue()));

此代码不起作用,即使客户端1仍在登录!虽然我看到我的redis是空的,并且已经没有令牌了,但是我的client1仍然在登录!这怎么可能?

================================================================================================这是我的配置:

客户端应用程序。yml:

server:
  port: 8081
  servlet:
    context-path: /clt1

spring:
  application:
    name: client1

  thymeleaf: 
    cache: false

security:
  oauth2:
    client:
      client-id: client1 
      client-secret: secret1
      userAuthorizationUri: http://localhost:8000/oa/oauth/authorize
      access-token-uri: http://localhost:8000/oa/oauth/token
      scope: read, write
      #pre-established-redirect-uri: http://localhost:8081/clt1/callback 
      #registered-redirect-uri: http://localhost:8081/clt1/callback
      #use-current-uri: false 
    resource:
      user-info-uri: http://localhost:8000/oa/user 
      #jwt:
      #  key-uri: http://localhost:8000/oa/oauth/token_key 

logging:
  level:
    root: info

客户端-安全配置:

@Configuration
@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
            .csrf().disable()
            .antMatcher("/**")
            .authorizeRequests()
            .antMatchers().permitAll()
            .anyRequest().authenticated()
            .and()
            .logout().logoutSuccessUrl("http://localhost:8000/oa/revokeClient").permitAll();
    }

}

Oauth-应用程序。yml:

server:
  port: 8000
  servlet:
    context-path: /oa

spring:
  application:
    name: security

  redis:
    host: 127.0.0.1
    port: 6379

  thymeleaf: 
    cache: false

logging:
  level:
    root: info

Oauth-授权配置:

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private TokenStore tokenStore;

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients
            .inMemory()
            .withClient("client1")
            .secret(passwordEncoder.encode("secret1"))
            .scopes("read", "write")
            .redirectUris("http://localhost:8081/clt1/login")
            .authorizedGrantTypes("authorization_code", "refresh_token")
            .autoApprove(true)
            .and()
            .withClient("client2")
            .secret(passwordEncoder.encode("secret2"))
            .scopes("read", "write")
            .redirectUris("http://localhost:8082/clt2/login")
            .authorizedGrantTypes("authorization_code", "refresh_token")
            .autoApprove(true);
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(tokenStore);
    }

}

Oauth-资源配置:

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

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

}

Oauth-SecurityConfig:

@Configuration
@EnableWebSecurity
@Order(1)//SecurityConfig >> ResourceConfig
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Autowired
    private CustomUserDetailsService customUserDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .requestMatchers()
            .antMatchers("/loginPage", "/login**", "/registerPage", "/register", "/oauth/authorize", "/revokeClient")
            .and()
            .authorizeRequests()
            .antMatchers("/registerPage", "/register").permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .formLogin().loginPage("/loginPage").loginProcessingUrl("/login").permitAll();

    }

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

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/css/**", "/docs/**", "/fonts/**", "/img/**", "/js/**", "/plugins/**");
    }

}

Oauth-应用:

@SpringBootApplication
@Configuration
public class SsoDemoOauthApplication {

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

    @Autowired
    private RedisConnectionFactory connectionFactory;

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

    public static void main(String[] args) {
        SpringApplication.run(SsoDemoOauthApplication.class, args);
    }

}

共有1个答案

阳昊
2023-03-14

我承认不太聪明,但是把

.logout().logoutSuccessUrl("http://localhost:8000/oa/logout").permitAll();

而不是

.logout().logoutSuccessUrl("http://localhost:8000/oa/revokeClient").permitAll();

在客户端应用程序的安全配置?有什么缺点吗?

 类似资料:
  • 我已经开始学习OAuth2 spring安全从一个星期,所以对不起,如果问题是容易的。在我开始研究之前,这个话题对我来说似乎很容易。我将在应用程序中为Restendpoint编写测试。为了做到这一点,我将为我的资源类编写测试。但我的应用程序使用的是OAuth2。 第一个想法是配置单独的授权服务器,扩展AuthorizationServerConfigurerAdapter用于此测试。我已经将Cli

  • 我试图在我的资源服务器上配置Swagger身份验证,以便我可以根据我的授权服务器进行身份验证。 我将资源服务器和授权服务器分开。它们都使用不同的端口在我的本地主机上启动。 端口8083上的资源服务器 每当我试图“授权”时,就会出现CORS问题。 我从另一个网站分叉了一个项目作为我的测试场地。下面是分叉项目。 https://github.com/cbriarnold/oauth2-spring-b

  • 我有一个oauth2客户端spring启动应用程序,其依赖项为:-spring-boot 1.2.0.rc1-spring-security-OAUTH2 2.0.4.release-spring-security3.2.5.release 客户端进行身份验证,身份验证在SecurityContextHolder中设置,但当请求重定向到原始url时,筛选器链将再次开始处理。我注意到在中,conte

  • 我正在使用Spring云安全和Oauth2来保护我的微服务。现在Pom如下: http://maven.apache.org/xsd/maven-4.0.0.xsd" Spring靴主要等级如下: 授权服务器配置如下: 注意:身份验证管理器自动连接到授权配置中 在下面的类中,身份验证管理器被配置并返回为abean,以便可以自动连接到上面的类: 现在application.properties如下:

  • 如何在我的Spring boot应用程序中禁用oauth2安全过滤,或者跳过安全检查,我只想直接点击Spring boot@RestController中的GET和POSTendpoint,而不经过安全过滤。 我正在使用以下配置 Spring版本

  • 我正在尝试一个安全Webflux配置,在这里我可以使用httpBasic登录一些资源,并使用oAuth登录其他资源 到目前为止,我还不知道该怎么做;似乎,在非反应性的方式中,可以使用某种领域名称或其他什么来实现,但在反应性的方式中,这并不存在,我认为这是因为它与线程的工作流或与web过滤器链中的工作流相关 但是我现在在科特林有以下几点, 检查noAuthPaths和basicAuthPaths是否