我们有一个使用spring-boot-security并配置为使用ssl的应用程序。
以下是我的安全配置
@Override
protected void configure(HttpSecurity http) throws Exception
{
// @formatter:off
http
.authorizeRequests()
.antMatchers("/css/**").permitAll()
.anyRequest().fullyAuthenticated()
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?error").permitAll()
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.and()
.exceptionHandling().accessDeniedPage("/access?error");
// @formatter:on
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception
{
auth.inMemoryAuthentication().withUser("admin").password("admin")
.roles("ADMIN", "USER", "ACTUATOR").and().withUser("user")
.password("user").roles("USER");
}
我们有一个方法级安全控制器,代码如下
@GetMapping("/")
@Secured("ROLE_ADMIN")
public String home(Map<String, Object> model)
{
model.put("message", "Hello World");
model.put("title", "Hello Home");
model.put("date", new Date());
return "home";
}
现在我们想使用@WebMvcTest
Annotation为控制器编写Junit案例,所以首先我要登录然后检查映射/
我已将JUNIT测试用例编写为
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HomeController.class, secure = true)
public class HomeControllerTest
{
@Autowired
private WebApplicationContext context;
private MockMvc mvc;
@Before
public void setup()
{
mvc = MockMvcBuilders.webAppContextSetup(context)
.apply(springSecurity()).build();
}
@Test
// @WithMockUser(authorities = "ADMIN")
public void testHome() throws Exception
{
/*
* TestSecurityContextHolder.getContext().setAuthentication( new
* UsernamePasswordAuthenticationToken("admin", "admin", AuthorityUtils
* .commaSeparatedStringToAuthorityList("ROLE_ADMIN")));
*/
this.mvc.perform(formLogin("/login").user("u", "admin").password("p", "admin"))
/*
* get("/").with(user("admin").password("pass").roles("USER",
* "ADMIN")) .accept(MediaType.APPLICATION_JSON_UTF8))
*/
.andExpect(authenticated()).andDo(print());
}
}
如何确保我的JUNIT按预期工作。下面是我的print()方法日志。我看到端口丢失,如何设置?
MockHttpServletRequest:
HTTP Method = POST
Request URI = /login
Parameters = {u=[admin], p=[admin], _csrf=[3f104e63-4a77-487c-9d1c-8b7cf2c2cead]}
Headers = {Accept=[application/x-www-form-urlencoded]}
Handler:
Type = null
Async:
Async started = false
Async result = null
Resolved Exception:
Type = null
ModelAndView:
View name = null
View = null
Model = null
FlashMap:
Attributes = null
MockHttpServletResponse:
Status = 302
Error message = null
Headers = {Location=[https://localhost/login]}
Content type = null
Body =
Forwarded URL = null
Redirected URL = https://localhost/login
Cookies = []
项目的代码库可以在github
中找到答案 0 :(得分:0)
对于初学者,您应该在配置基于表单的登录时设置defaultSuccessUrl()
(例如,通过将其设置为&#34; /&#34;)。然后,在成功登录尝试后,用户将被重定向。
一旦配置完毕,就可以更轻松地测试您的用例。
您可以首先使用.andExpect(redirectedUrl("/"))
测试成功登录是否重定向到主页(&#34; /&#34;)。这应该是一种测试方法。
在使用@WithMockUser(roles = "ADMIN")
注释的第二个测试方法中,您可以验证是否允许 ADMIN 访问主页(&#34; /&#34;)。
关于端口号,如果您确定确实需要设置自定义端口,则应该能够在ApplicationContext
中将自定义SpringBootMockMvcBuilderCustomizer注册为bean并使用它来设置默认端口请求可以指定您的自定义端口。
此致
萨姆