2017-02-26 8 views
8

で作成したユーザーのための@WithUserDetailsは、春のセキュリティユーザとして認証するための2つの方法があります@WithMockUserは、提供された資格情報を持つダミーのユーザーを作成し、@WithUserDetailsは、ユーザーの名前を取りますカスタムUserDetailsServiceUserDetailsServiceImpl)の正しいカスタムUserDetailsの実装に解決します。春のセキュリティ、JUnitの:春MockMVCとJUnitテストでは@Before

私の場合、UserDetailsServiceはデータベースからユーザーを読み込みます。使用したいユーザーは、テストスイートの@Beforeメソッドに挿入されました。

ただし、私のUserDetailsServiceImplはユーザーを見つけられません。私@Before

は、私はこのようなユーザーを挿入します。

User u = new User(); 
u.setEMail("[email protected]"); 
u = userRepository.save(u); 

そして中

UserDetailsServiceImpl

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
    User user = this.userRepository.findOneByEMail(username); 

    if (user == null) 
     throw new UsernameNotFoundException(String.format("No user found with username '%s'.", username)); 
    return user; 
} 

どのように私は@WithUserDetails@Beforeで作成したアカウントを使用できますか?

答えて

4

残念ながら、Spring @WithUserDetailsアノテーションは@BeforeでsetUpメソッドを実行する前にSpringセキュリティコンテキストテストリスナーを呼び出すため、@Beforeで@WithUserDetailsを簡単に行うことはできません。

ここにはhttps://stackoverflow.com/a/38282258/1814524という小さなトリックとあなたの質問に対する答えがあります。

3
@Inject 
private EntityManager em; 

@Inject 
PlatformTransactionManager txManager; 

@BeforeTransaction 
public void setup() { 
    new TransactionTemplate(txManager).execute(status -> { 

     User u = new User(); 
     u.setEMail("[email protected]"); 
     em.save(u); 

     return null; 
    }); 
} 

@AfterTransaction 
public void cleanup() { 
    new TransactionTemplate(txManager).execute(status -> { 
     // Check if the entity is managed by EntityManager. 
     // If not, make it managed with merge() and remove it. 
     em.remove(em.contains(u) ? user1 : em.merge(u)); 
     return null; 
    }); 
} 


@Test 
@Transactional 
@WithUserDetails(value = "[email protected]", userDetailsServiceBeanName = "loadUserByUsername") 
public void test() { 

} 
関連する問題