質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Spring Security

Spring Securityは、Springのサブプロジェクトの一つでWebアプリケーションに必要な機能を追加します。正規ユーザーであるかを確認するための「認証機能」と、ユーザーのアクセスを制御する「認可機能」を簡単に追加することが可能です。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

0回答

494閲覧

Spring Bootで実装した認可機能をテストしたい

be834194

総合スコア15

Spring Security

Spring Securityは、Springのサブプロジェクトの一つでWebアプリケーションに必要な機能を追加します。正規ユーザーであるかを確認するための「認証機能」と、ユーザーのアクセスを制御する「認可機能」を簡単に追加することが可能です。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/12/16 10:02

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問