随着Spring Security 4的发布及其对测试的增强支持,我想更新我当前的Spring Security
oauth2资源服务器测试。
目前,我有一个帮助程序类,用于建立与测试连接到实际应用程序的OAuth2RestTemplate
使用ResourceOwnerPasswordResourceDetails
,以为我的测试请求有效令牌。然后,此resttemplate用于在s中发出请求。ClientId``AccessTokenUri``@WebIntegrationTest
我想利用Spring Security
4中的新测试支持,放弃对实际AuthorizationServer的依赖,并在测试中使用有效的(如果有限制的)用户凭据。
到现在为止我都在尝试使用@WithMockUser
,@WithSecurityContext
,SecurityMockMvcConfigurers.springSecurity()
和SecurityMockMvcRequestPostProcessors.*
都没能进入通过身份验证的电话MockMvc
,我找不到在Spring示例项目任何此类工作的例子。
有人可以帮助我使用某种模拟的凭据来测试我的oauth2资源服务器,同时仍然测试所施加的安全性限制吗?
编辑 此处提供示例代码:https : //github.com/timtebeek/resource-server-
testing
对于每个测试类,我都知道为什么它不能如此工作,但是我正在寻找方法可以让我轻松测试安全设置。
我现在正在考虑在下创建一个非常宽松的OAuthServer src/test/java
,这可能会有所帮助。还有其他建议吗?
为了有效地测试资源服务器的安全性,通过MockMvc
和RestTemplate
都可以帮助配置AuthorizationServer
under
src/test/java
:
授权服务器
@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");
}
}
MockMvc测试 也可以 进行
测试MockMvc
,但需要一个小的帮助程序类来获取一个在请求上RequestPostProcessor
设置Authorization: Bearer <token>
标头的类:
@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);
}
}
MockMvc
然后,您的测试必须RequestPostProcessor
从OauthHelper
类中获取一个,并在发出请求时将其传递:
@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资源服务器测试。 目前,我有一个helper类,它使用设置,并使用一个test连接到一个实际的来为我的测试请求一个有效的令牌。然后使用此resttemplate在我的中发出请求。 通过利用Spring Security4中的新测试支持,我希望在测试中放弃对实际AuthorizationServ
问题内容: 我们已经设置了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,用户需要通过表单登录。 所有这些现在都需要放在一