我有一个带弹簧安全性的弹簧mvc(3.2.5)应用程序(3.2).
我使用此方法配置了SecurityConfig.class:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/*").permitAll().and()
.formLogin().successHandler(successHandler)
.defaultSuccessUrl("/")
.failureHandler(failureHandler).failureUrl("/login?error=true")
.permitAll().and().logout()
.permitAll();
http.authorizeRequests().antMatchers("/resources/**").permitAll();
http.authorizeRequests().antMatchers("/welcome").permitAll();
http.authorizeRequests().antMatchers("/secure/*").authenticated();
http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").anyRequest().authenticated();
}
Run Code Online (Sandbox Code Playgroud)
使用Spring security(3.2),我启用了CSRF.我认为启用它是个好主意.
我的控制器SignInController包含两个带params的方法:
编辑:添加action=参数
@RequestMapping(value = "/signup")
public ModelAndView signup() {
boolean auth = SecurityContextHolder.getContext().getAuthentication() == null ? false
: SecurityContextHolder.getContext().getAuthentication()
.isAuthenticated()
&& (SecurityContextHolder.getContext()
.getAuthentication().getPrincipal() instanceof User);
ModelAndView result = null;
if (auth) {
result = new ModelAndView("redirect:" + "/");
} else {
UserForm user = new UserForm();
result = new ModelAndView("registration", "userForm", user);
}
return …Run Code Online (Sandbox Code Playgroud) 我正在尝试@WebMvcTest使用类中定义的自定义安全设置 进行测试SecurityConfig:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/admin*").access("hasRole('ADMIN')").antMatchers("/**").permitAll().and().formLogin();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("user").password("password").roles("ADMIN");
}
}
Run Code Online (Sandbox Code Playgroud)
测试类是:
@RunWith(SpringRunner.class)
@WebMvcTest(value = ExampleController.class)
public class ExampleControllerMockMVCTest {
@Autowired
private MockMvc mockMvc;
@Test
public void indexTest() throws Exception {
mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andExpect(view().name("index"));
}
@Test
public void adminTestWithoutAuthentication() throws Exception {
mockMvc.perform(get("/admin"))
.andExpect(status().is3xxRedirection()); //login form redirect
}
@Test
@WithMockUser(username="example", password="password", roles={"ANONYMOUS"})
public void adminTestWithBadAuthentication() throws …Run Code Online (Sandbox Code Playgroud) 不能让我的@SpringBootTest工作.它说身份验证已启用,我不想要.
我已经设置好了 @AutoConfigureMockMvc(secure = false)
我提交了一个带有一些JSON的模拟请求,我的集成测试应该测试整个堆栈,通过Web层将SDR带到JPA然后进入内存数据库,这样我就可以使用它进行测试JdbcTemplate.
但响应是401,需要身份验证.为什么@AutoConfigureMockMvc(secure = false)不够?少了什么东西?
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
classes = { TestDataSourceConfig.class })
@EnableAutoConfiguration
@AutoConfigureMockMvc(secure = false)
@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2)
@Transactional
public class SymbolRestTests {
@Autowired
private MockMvc mockMvc;
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private SymbolRepository symbolRepository;
@PersistenceContext
private EntityManager entityManager;
@Test
public void shouldCreateEntity() throws Exception {
String testTitle = "TEST.CODE.1";
String testExtra = "Test for SymbolRestTests.java";
String json = createJsonExample(testTitle, testExtra, true);
log.debug(String.format("JSON==%s", json));
MockHttpServletRequestBuilder …Run Code Online (Sandbox Code Playgroud) 我编写了一个测试UsersController的单元测试。UsersControllerTest.findUser工作正常,但是UsersControllerTest.insertGetModifyDelete不能正常工作。
在测试日志中,我可以看到POST请求与UsersController的任何方法都不匹配,但是我不明白为什么。您能帮我这个吗?
这是我其余的Java类:
@RestController
@RequestMapping("/users")
public class UsersController {
private final UsersService usersService;
@Autowired
public UsersController(UsersService usersService) {
this.usersService = usersService;
}
@GetMapping(value="/{email}", produces="application/json")
public User get(@PathVariable @Email String email) {
return usersService.findByEmail(email);
}
@PostMapping(consumes="application/json", produces="application/json")
@ResponseBody
public ResponseEntity<String> insert(@RequestBody @Valid User user){
usersService.insert(user);
return ResponseEntity.ok(user.getEmail());
}
@DeleteMapping(value="/{email}", consumes="application/json", produces="application/json")
public ResponseEntity<String> delete(@PathVariable @Email String email) {
usersService.delete(email);
return ResponseEntity.ok(email);
}
@PutMapping(value="/{email}", consumes="application/json", produces="application/json")
public ResponseEntity<User> update(@PathVariable @Email String email, @RequestBody @Valid User user) {
usersService.update(email, user);
return ResponseEntity.ok(user);
} …Run Code Online (Sandbox Code Playgroud)