使用MockMvc测试@preAuthorize(custom_implementation)

时间:2017-09-27 12:23:46

标签: java spring spring-mvc

我在控制器方法的基础上添加了@preAuthorize("@securityService.hasPermission()"),并使用给定的方法创建了相关的bean -

  @Configuration
   public class SecurityConfig {
   @Bean
   public PreAuthorizationSecurityService securityService() {
      return new PreAuthorizationSecurityService();
   }
  }

现在,我使用MockMvc测试我的控制器。当我将SecurityConfig.class添加到测试类的ContextConfiguration时,控制器方法会检查权限。但是,我想以一种我的课程不必导入PreAuthorizationSecurityService进行测试的方式来模拟SecurityConfig.class

1 个答案:

答案 0 :(得分:0)

如果您只想声明服务的模拟而不是导入整个 <form method="post" name="form" (ngSubmit)="f.form.valid && login()" #f="ngForm" novalidate> <fieldset> <p> <label>Username</label> <input type="text" placeholder="e.g. JohnDoe" [(ngModel)]="model.username" #username="ngModel" name="username" required/> </p> <p [ngClass]="{ 'has-error': f.submitted && !password.valid }"> <label>Password</label> <input type="password" placeholder="Password" name="password" [(ngModel)]="model.password" #password="ngModel" required/> </p> <p> <input type="submit" [disabled]="loading" class="btn" value="Login"> </p> </fieldset> </form> ,您可以通过在测试配置中声明这一点来轻松实现:

SecurityConfig

然后将mock设置为在需要时返回true。您还可以提供自己的模拟实现,始终返回true。

也就是说,这不是使用Spring Security的常用方法。您应该考虑重构您的应用程序以使用标准的基于角色的系统,它将为您省去一些麻烦。

我不知道你的@Configuration public class TestConfig { @Bean public PreAuthorizationSecurityService mockedSecurityService() { //providing you use Mockito for mocking purpose return mock(PreAuthorizationSecurityService.class); } } 看起来是什么样的,如果这适用于你的情况,但在大多数情况下,它应该是你应该瞄准的目标。

使用这种基于标准角色的方法,Spring Security Test(v4 +我认为)可以轻松地使用@WithMockUser等注释模拟具有给定角色的连接用户。