Spring Bootでアプリケーションを作成しているプログラミング初心者です。
teratailで質問するのは今回が初めてです。情報が不足しているなど至らない点があると思います。ご不明な点は都度回答いたしますので、何卒よろしくお願いいたします。
前提・実現したいこと
認可処理としてAccessDecisionVoter<FilterInvocation>の実装クラスを作成しました。
認可処理の単体テストで以下3つのメソッドのテスト結果を確認したいです。
- supports(ConfigAttribute attribute)
- supports(Class<?> clazz)
- vote(Authentication authentication,
FilterInvocation filterInvocation,
Collection<ConfigAttribute> attributes)
テストの際にメソッドに渡す引数は、テストクラスでどう用意すれば良いでしょうか。
引数として渡すクラス名と、その変数に設定すべき値を知りたいです。
該当のソースコード
MyVoter
1public class MyVoter implements AccessDecisionVoter<FilterInvocation>{ 2 3 @Autowired 4 AuthorizationService authorizationService; 5 6 @Override 7 public boolean supports(ConfigAttribute attribute) { 8 return true; 9 } 10 11 @Override 12 public boolean supports(Class<?> clazz) { 13 return true; 14 } 15 16 @Override 17 public int vote(Authentication authentication, FilterInvocation filterInvocation, 18 Collection<ConfigAttribute> attributes) { 19 20 HttpServletRequest request = filterInvocation.getHttpRequest(); 21 String uri = request.getRequestURI(); 22 if(authorizationService.isAuthorized("*", uri)) { 23 return ACCESS_GRANTED; 24 } 25 26 Object principal = authentication.getPrincipal(); 27 if(!principal.getClass().equals(DbUserDetails.class)) { 28 return ACCESS_DENIED; 29 } 30 31 Account account = ((DbUserDetails)principal).getAccount(); 32 if(authorizationService.isAuthorized(account.getRole(), uri)) { 33 return ACCESS_GRANTED; 34 }else { 35 return ACCESS_DENIED; 36 } 37 38 } 39
以下、認可処理に関連してくるクラス,xmlファイルになります。
AuthorizationService
1public class AuthorizationService { 2 3 @Autowired 4 AccessAuthorizationMapper accessAuthorizationMapper; 5 6 public boolean isAuthorized(String roleName, String uri) { 7 if(Objects.isNull(roleName)) { 8 throw new IllegalArgumentException("RoleNameが空です。"); 9 } 10 11 if (Objects.isNull(uri)) { 12 throw new IllegalArgumentException("URIが空です。"); 13 } 14 15 try { 16 AccessAuthorization auth = accessAuthorizationMapper.findAuthUri(roleName, uri); 17 if(auth != null) { 18 return true; //アクセス許可 19 }else { 20 return false; //アクセス拒否 21 } 22 }catch(EmptyResultDataAccessException e) { 23 return false; 24 } 25 26 } 27 28}
DbUserDetails
1public class DbUserDetails implements UserDetails { 2 3 private final Account account; 4 private final Collection<GrantedAuthority> authorities; 5 6 public DbUserDetails(Account account,Collection<GrantedAuthority> authorities) { 7 this.account = account; 8 this.authorities = authorities; 9 } 10 11 public Collection<? extends GrantedAuthority> getAuthorities() { 12 return authorities; 13 } 14 15 public String getPassword() { 16 return account.getPassword(); 17 } 18 19 public String getUsername() { 20 return account.getUserName(); 21 } 22 23 public boolean isAccountNonExpired() { 24 return true; 25 } 26 27 public boolean isAccountNonLocked() { 28 return true; 29 } 30 31 public boolean isCredentialsNonExpired() { 32 return true; 33 } 34 35 public boolean isEnabled() { 36 return true; 37 } 38 39 public Account getAccount() { 40 return account; 41 }
AccessAuthorizationMapper
1 <select id="findAuthUri" resultType="com.rookie.sharebook.entity.AccessAuthorization"> 2 SELECT 3 ROLENAME, 4 URI 5 FROM 6 ACCESS_AUTHORIZATION 7 WHERE 8 ROLENAME = #{roleName} 9 <if test='roleName == "*"'> 10 AND URI = #{uri} 11 </if> 12 <if test='roleName != "*"'> 13 AND URI LIKE CONCAT(SUBSTRING(#{uri},1,6),'%') 14 </if> 15 </select>
WebSecurityConfig
1public class WebSecurityConfig extends WebSecurityConfigurerAdapter{ 2 //~省略 3 @Autowired 4 AccessDecisionVoter<FilterInvocation> myVoter; 5 6 public AccessDecisionManager createAccessDecisionManager() { 7 return new AffirmativeBased(Arrays.asList(myVoter)); 8 } 9 //~省略
補足情報(FW/ツールのバージョンなど)
Spring Boot <version>2.5.6
あなたの回答
tips
プレビュー