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

测试时忽略Spring控制器上的预授权注释

卫飞
2023-03-14

MyControllerTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext-test.xml" })
public class MyControllerTest {

    private MockMvc mockMvc;

    @Mock
    private MyService myService;

    @InjectMocks
    private MyController myController;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);  
        mockMvc = MockMvcBuilders.standaloneSetup(myController).build();
    }

   @Test
   public void getAccounts_ReturnsOkStatus() throws Exception {
       // Make the GET request, and verify that it returns HttpStatus.OK (200)
       mockMvc.perform(MockMvcRequestBuilders.get("/accounts"))
              .andExpect(MockMvcResultMatchers.status().isOk());
   }
}

ApplicationContext-test.xml

<sec:global-method-security pre-post-annotations="enabled" />
<bean id="applicationContextProvider" class="com.myapp.springsupport.ApplicationContextProvider" />

<sec:authentication-manager alias="authenticationManager">
   <sec:authentication-provider>
       <sec:user-service>
           <sec:user name="test-superuser" password="test-pwd" authorities="ROLE_SUPERUSER" />
       </sec:user-service>
   </sec:authentication-provider>
</sec:authentication-manager>

MyController.java

@PreAuthorize("isAuthenticated() and hasRole('ROLE_SUPERUSER')")
@RequestMapping(value = "/accounts", method = RequestMethod.GET)
@ResponseBody
public Collection<Account> getAccounts() {
    return new ArrayList<Account>();
}
Authentication auth = new UsernamePasswordAuthenticationToken(name, password);
SecurityContextHolder.getContext().setAuthentication(am.authenticate(auth));

共有1个答案

经和歌
2023-03-14

构建mockmvc时,必须启用Spring Security性进行测试。

在Spring 4中是这样的:

mockMvc = MockMvcBuilders.webAppContextSetup(context)
                         .apply(springSecurity())
                         .build();

在Spring3中是这样的:

@Autowired
private Filter springSecurityFilterChain;
...
mockMvc = MockMvcBuilders.webAppContextSetup(context)
                         .addFilters(springSecurityFilterChain)
                         .build();
    null
 类似资料:
  • 问题内容: 正在尝试在方法级别定义访问规则,但是它从未如此有效。 安全配置 ExampleController 每当我尝试使用user:user它访问/ v2 / home时,它执行得很好,是否由于“用户”没有访问权限而给我“拒绝访问”错误ROLE_ADMIN? 我实际上是在考虑在方法级别放弃访问规则并坚持使用http()ant规则,但是我必须知道为什么它对我不起作用。 问题答案: 在控制器上使用

  • 我的Spring安全配置如下: 我只包括了spring security,而不是oauth2。由于某些原因,如果有人使用授权头访问任何允许的url,例如/rest/app/health,他将获得401未授权。没有头部的情况下工作正常。 我怎么能忽略授权头,因为我需要这个头作为请求参数来将我的请求委托给第三方服务。

  • 我有我的OAuth服务器和客户端,它是由Oauth2授权的。 现在,如果我需要呼叫我的服务,我需要: > 使用以下API从服务器生成访问令牌: < code > localhost:9191/oauth/token?grant _ type =密码 其给出如下响应: 现在我正在传递访问令牌,以运行客户端服务,如下所示: 我需要跳过控制器的身份验证。我该怎么做?有人能帮忙吗 我的WebSecurit

  • 我发现了许多类似的问题,但没有一个解决了我的问题。我的问题是可以访问的函数 下面是我的spring-security.xml代码。

  • 本文向大家介绍Spring Security 控制授权的方法,包括了Spring Security 控制授权的方法的使用技巧和注意事项,需要的朋友参考一下 本文介绍了Spring Security 控制授权的方法,分享给大家,具体如下: 使用授权方法进行授权配置 每一个 Spring Security 控制授权表达式(以下简称为表达式)实际上都在在 API 中对应一个授权方法,该方法是请求的 UR

  • 我已经建立了一个完全工作的Spring Security流程,其中一些路径需要验证(通过令牌),而其他路径我希望保持开放和可访问,而不需要令牌。我遇到的问题是,当一个请求没有头而进入其中一个开放路径时,筛选器将被忽略,并生成正确的响应。但是,当头存在时,即使在忽略的路径上,请求也会通过整个安全筛选器链,而理想的过程是完全跳过筛选器链。 下面是我的配置。 此外,我还尝试使用将忽略的路径放入中,但没有