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

如何测试spring-security-oauth2资源服务器的安全性?

祁博涛
2023-03-14

在Spring Security 4发布之后,我想更新我当前的Spring Security oauth2资源服务器测试。

目前,我有一个helper类,它使用ResourceOwnerPasswordResourceDetails设置OAuth2RestTemplate,并使用一个testClientId连接到一个实际的AccessTokeKenuri来为我的测试请求一个有效的令牌。然后使用此resttemplate在我的@WebIntegrationTest中发出请求。

通过利用Spring Security4中的新测试支持,我希望在测试中放弃对实际AuthorizationServer的依赖,以及对有效(如果有限的话)用户凭据的使用。

到目前为止,我使用@WithMockUser@WithSecurityContextSecurityMockMVCConfigurers.SpringSecurity()&SecurityMockMVCrequestPostProcessors.*的所有尝试都未能通过MockMVC进行经过身份验证的调用,而且我在Spring示例项目中找不到任何这样的工作示例。

有人能帮助我测试我的oauth2资源服务器与某种嘲弄的凭据,同时仍然测试所施加的安全限制吗?

**编辑**这里提供的示例代码:https://github.com/timtebeek/resource-server-testing For each of the test class我明白为什么它不能正常工作,但我正在寻找能够让我轻松测试安全设置的方法。

我现在考虑在src/test/java下创建一个非常允许的OAuthServer,这可能会有点帮助。还有什么其他的建议吗?

共有1个答案

萧阳波
2023-03-14

为了有效地测试资源服务器安全性,使用mockmvcresttemplate可以在src/test/java下配置authorizationserver

授权服务器

@Configuration
@EnableAuthorizationServer
@SuppressWarnings("static-method")
class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    @Bean
    public JwtAccessTokenConverter accessTokenConverter() throws Exception {
        JwtAccessTokenConverter jwt = new JwtAccessTokenConverter();
        jwt.setSigningKey(SecurityConfig.key("rsa"));
        jwt.setVerifierKey(SecurityConfig.key("rsa.pub"));
        jwt.afterPropertiesSet();
        return jwt;
    }

    @Autowired
    private AuthenticationManager   authenticationManager;

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

    @Override
    public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
        .withClient("myclientwith")
        .authorizedGrantTypes("password")
        .authorities("myauthorities")
        .resourceIds("myresource")
        .scopes("myscope")

        .and()
        .withClient("myclientwithout")
        .authorizedGrantTypes("password")
        .authorities("myauthorities")
        .resourceIds("myresource")
        .scopes(UUID.randomUUID().toString());
    }
}

集成测试
对于集成测试,您可以简单地使用内置的OAuth2测试支持规则和注释:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyApp.class)
@WebIntegrationTest(randomPort = true)
@OAuth2ContextConfiguration(MyDetails.class)
public class MyControllerIT implements RestTemplateHolder {
    @Value("http://localhost:${local.server.port}")
    @Getter
    String                      host;

    @Getter
    @Setter
    RestOperations              restTemplate    = new TestRestTemplate();

    @Rule
    public OAuth2ContextSetup   context         = OAuth2ContextSetup.standard(this);

    @Test
    public void testHelloOAuth2WithRole() {
        ResponseEntity<String> entity = getRestTemplate().getForEntity(host + "/hello", String.class);
        assertTrue(entity.getStatusCode().is2xxSuccessful());
    }
}

class MyDetails extends ResourceOwnerPasswordResourceDetails {
    public MyDetails(final Object obj) {
        MyControllerIT it = (MyControllerIT) obj;
        setAccessTokenUri(it.getHost() + "/oauth/token");
        setClientId("myclientwith");
        setUsername("user");
        setPassword("password");
    }
}
@Component
public class OAuthHelper {
    // For use with MockMvc
    public RequestPostProcessor bearerToken(final String clientid) {
        return mockRequest -> {
            OAuth2AccessToken token = createAccessToken(clientid);
            mockRequest.addHeader("Authorization", "Bearer " + token.getValue());
            return mockRequest;
        };
    }

    @Autowired
    ClientDetailsService                clientDetailsService;
    @Autowired
    AuthorizationServerTokenServices    tokenservice;

    OAuth2AccessToken createAccessToken(final String clientId) {
        // Look up authorities, resourceIds and scopes based on clientId
        ClientDetails client = clientDetailsService.loadClientByClientId(clientId);
        Collection<GrantedAuthority> authorities = client.getAuthorities();
        Set<String> resourceIds = client.getResourceIds();
        Set<String> scopes = client.getScope();

        // Default values for other parameters
        Map<String, String> requestParameters = Collections.emptyMap();
        boolean approved = true;
        String redirectUrl = null;
        Set<String> responseTypes = Collections.emptySet();
        Map<String, Serializable> extensionProperties = Collections.emptyMap();

        // Create request
        OAuth2Request oAuth2Request = new OAuth2Request(requestParameters, clientId, authorities, approved, scopes,
                resourceIds, redirectUrl, responseTypes, extensionProperties);

        // Create OAuth2AccessToken
        User userPrincipal = new User("user", "", true, true, true, true, authorities);
        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userPrincipal, null, authorities);
        OAuth2Authentication auth = new OAuth2Authentication(oAuth2Request, authenticationToken);
        return tokenservice.createAccessToken(auth);
    }
}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyApp.class)
@WebAppConfiguration
public class MyControllerTest {
    @Autowired
    private WebApplicationContext   webapp;

    private MockMvc                 mvc;

    @Before
    public void before() {
        mvc = MockMvcBuilders.webAppContextSetup(webapp)
                .apply(springSecurity())
                .alwaysDo(print())
                .build();
    }

    @Autowired
    private OAuthHelper helper;

    @Test
    public void testHelloWithRole() throws Exception {
        RequestPostProcessor bearerToken = helper.bearerToken("myclientwith");
        mvc.perform(get("/hello").with(bearerToken)).andExpect(status().isOk());
    }

    @Test
    public void testHelloWithoutRole() throws Exception {
        RequestPostProcessor bearerToken = helper.bearerToken("myclientwithout");
        mvc.perform(get("/hello").with(bearerToken)).andExpect(status().isForbidden());
    }
}

完整的示例项目可在GitHub上获得:
https://github.com/timtebeek/resource-server-testing

 类似资料:
  • 问题内容: 随着Spring Security 4的发布及其对测试的增强支持,我想更新我当前的Spring Security oauth2资源服务器测试。 目前,我有一个帮助程序类,用于建立与测试连接到实际应用程序的使用,以为我的测试请求有效令牌。然后,此resttemplate用于在s中发出请求。 我想利用Spring Security 4中的新测试支持,放弃对实际AuthorizationSe

  • 问题内容: 我们已经设置了OAuth2授权服务器,因此我需要创建一个相应的资源服务器(单独的服务器)。我们计划使用Spring Security OAuth2项目。他们关于设置资源服务器的文档: https://github.com/spring-projects/spring-security- oauth/wiki/oAuth2#resource-server-configuration 应该

  • 我们已经设置了一个OAuth2授权服务器,所以我需要创建一个相应的资源服务器(单独的服务器)。我们计划使用Spring Security OAuth2项目。他们关于设置资源服务器的文档: https://github.com/spring-projects/spring-security-oauth/wiki/oauth2#资源-服务器-配置 应该指向令牌处理bean。然而,令牌处理似乎是由服务器

  • 我可以考虑使用一个拦截器来拦截使用ClientHttpRequestInterceptor的请求,并有一个重试逻辑。但是,当认证服务器短时间不可用时,是否有一种正确的方法来实现资源服务器的弹性或恢复机制。 任何指示都会有帮助。

  • 我试图在java配置上配置Spring Security性和OAuth2。我使用的是Spring Security版本4.0.4。发布并发布OAuth2版本2.0.11。释放 Spring Security配置工作良好。此外,我可以使用OAuth2 AuthorizationServer获得访问令牌,但我的ResourceServer无法正常工作。当我设置注释@EnableResourceServ

  • 我正在使用Spring Boot,我希望我的应用程序托管OAuth2资源服务器,以便在同一服务器上访问我的apiendpoint。我还需要有一个网页界面,通过表格登录的安全页面。 例如,我有apiendpoint/api/v1/**,在这里只能通过从oauth2资源服务器获得令牌来发出请求。 此外,还有像/account/**这样的endpoint,用户需要通过表单登录。 所有这些现在都需要放在一