- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用:
request.IsUserInRole("ADMIN")
在我的 Controller 之一中确定对请求的响应。我尝试在测试中模拟请求,例如:
@Mock
private HttpServletRequest httpRequest;
并使用Springs注释@WithMockUser
:
@Test
@WithMockUser(roles={"USER, ADMIN"})
public void getAccountsTest() throws Exception {...}
两者都不起作用。
问题 1:如何在 JUnit 测试中模拟 request.IsUserInRole("ADMIN")
?
问题2:@WithMockUser
对请求和request.IsUserInRole("ADMIN")
有什么影响?
谢谢并致以诚挚的问候
---- 编辑 ----
“不起作用”意味着我有一个测试方法:
@Test
@WithMockUser(username = "user", roles={"USER"})
public void getAccountsReturnForbiddenTest() throws Exception {
mockMvc.perform(get("/accounts/"))
.andExpect(status().isForbidden());
}
应该返回 403,由于 Controller 的原因不允许:
@RequestMapping(method=RequestMethod.GET)
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<PagedResources<AccountResource>> getAccounts(...){...}
但是请求返回 200,好的。
我正在使用 Spring Boot 1.4.1。
---- 编辑 2 ----
我的 JUnit 测试类:
@Transactional
@ContextConfiguration
public class AccountControllerTestDoc extends AbstractControllerTest {
@InjectMocks
private AccountController accountController;
@Mock
private AccountService accountService;
private String uriBase = "";
@Before
public void setup() {
// Initialize Mockito annotated components
MockitoAnnotations.initMocks(this);
// Prepare the Spring MVC Mock components for standalone testing
setup(accountController);
}
@Test
@WithMockUser(username = "user", roles={"USER"})
public void getAccountsReturnForbiddenTest() throws Exception {
String uri = uriBase + "/accounts";
mockMvc.perform(get(uri))
.andExpect(status().isForbidden());
}
}
使用 AbstractControllerTest:
@WebAppConfiguration
public abstract class AbstractControllerTest extends AbstractTest {
protected MockMvc mockMvc;
@Autowired
protected WebApplicationContext wac;
protected void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}
protected void setup(BaseController controller) {
mockMvc = MockMvcBuilders.standaloneSetup(controller))
.build();
}
}
和抽象测试:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public abstract class AbstractTest {
protected Logger LOG = LoggerFactory.getLogger(this.getClass());
}
----解决方案----
MockMvc
standaloneSetup
不知道 Web 应用程序上下文,因此不知道安全过滤器链。必须使用 Web 应用程序上下文和安全过滤器链设置 MockMvc
才能测试安全方面。
这是我现在正在工作的解决方案,我编辑了 AbstractControllerTest:
@WebAppConfiguration
public abstract class AbstractControllerTest extends AbstractTest {
protected MockMvc mockMvc;
@Autowired
protected WebApplicationContext wac;
@Autowired
FilterChainProxy springSecurityFilterChain;
protected void setup() {
mockMvc = MockMvcBuilders
.webAppContextSetup(wac)
.addFilters(springSecurityFilterChain)
.build();
}
protected void setup(BaseController controller) {
mockMvc = MockMvcBuilders.standaloneSetup(controller))
.build();
}
}
最佳答案
您应该在创建MockMvc
时添加springSecurityFilterChain
protected MockMvc mockMvc;
@Autowired
protected WebApplicationContext wac;
@Autowired
protected Filter springSecurityFilterChain;
protected void setup() {
mockMvc = MockMvcBuilders
.webAppContextSetup(wac)
.addFilters(springSecurityFilterChain)
.build();
}
关于java - Spring @WithMockUser 和 request.IsUserInRole(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40082745/
如何在 Spring security 单元测试中运行具有不同角色的每一行代码?使用时@WithMockUser只能以选定的权限运行整个方法,但我想以不同的权限运行每一行代码,所以我需要一个无注释的解
我正在使用 spring OAuth2 和 JWT token 来保护应用程序。我正在扩展 org.springframework.security.core.userdetails 以便向 toke
尽管我的测试方法使用@WithMockUser 进行了注释,但我仍然遇到访问被拒绝的情况。为什么这在集成测试中不起作用?使用@WebAppConfiguration 和 MockMvc 测试一切正常。
我已经使用 Spring Security 以经典方式在我的 Controller 中设置了基本身份验证,如下所示: @EnableWebSecurity @EnableGlobalMethodSec
我正在尝试使用 @WithMockUser 测试来测试我的 CommentController,但似乎找不到用户(因为用户 id (author_id) 为空)或评论内容。我不确定测试是否以正确的方式
我正在使用: request.IsUserInRole("ADMIN") 在我的 Controller 之一中确定对请求的响应。我尝试在测试中模拟请求,例如: @Mock private HttpSe
我将 Spring Boot 用于我的 Web 应用程序并使用 TestNG 进行单元测试。以下是我正在尝试的单元测试 @ContextConfiguration public class Autho
我刚刚发现了新的 Spring Security 4 测试注释 @WithMockUser,但我无法让它用于我的 Selenium 测试。问题是,这个注解创建了一个模拟的 SecurityContex
我正在使用 Cucumber 测试来测试启用了 Spring Security 的 Spring Boot 应用程序。一切正常,除非我使用 Cucumber 测试运行我的测试套件,一些使用 Sprin
环境:我有一个基于 spring boot 的微服务架构应用程序,由多个基础设施服务和资源服务(包含业务逻辑)组成。授权和身份验证由管理用户实体并为客户端创建 JWT token 的 oAuth2 服
由于我从 1.x 迁移到 Spring Boot 2.0.5,并且无意禁用安全性,因此我无法让测试角色进行模拟 MVC 测试: @RunWith(SpringRunner.class) @Spring
我正在为一个 spring 项目构建一个基于权限的访问控制,它具有分层权限。为此,我将 GrantedAuthority 对象扩展为 Permission。自定义 PermissionVoter 最终
我已经花了整整几天时间试图弄清楚我做错了什么,但不知道为什么它不起作用。首先,我想说的是,以下配置主要是从我正在处理的另一个项目中复制而来的,并且这些项目可以毫无问题地运行(但是它们的配置略有不同,并
我是一名优秀的程序员,十分优秀!