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

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

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

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

ユニットテスト

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

Spring Boot

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

受付中

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

be834194
be834194

総合スコア15

Spring Security

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

ユニットテスト

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

Spring Boot

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

0回答

0評価

0クリップ

124閲覧

投稿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

public class MyVoter implements AccessDecisionVoter<FilterInvocation>{ @Autowired AuthorizationService authorizationService; @Override public boolean supports(ConfigAttribute attribute) { return true; } @Override public boolean supports(Class<?> clazz) { return true; } @Override public int vote(Authentication authentication, FilterInvocation filterInvocation, Collection<ConfigAttribute> attributes) { HttpServletRequest request = filterInvocation.getHttpRequest(); String uri = request.getRequestURI(); if(authorizationService.isAuthorized("*", uri)) { return ACCESS_GRANTED; } Object principal = authentication.getPrincipal(); if(!principal.getClass().equals(DbUserDetails.class)) { return ACCESS_DENIED; } Account account = ((DbUserDetails)principal).getAccount(); if(authorizationService.isAuthorized(account.getRole(), uri)) { return ACCESS_GRANTED; }else { return ACCESS_DENIED; } }

以下、認可処理に関連してくるクラス,xmlファイルになります。

AuthorizationService

public class AuthorizationService { @Autowired AccessAuthorizationMapper accessAuthorizationMapper; public boolean isAuthorized(String roleName, String uri) { if(Objects.isNull(roleName)) { throw new IllegalArgumentException("RoleNameが空です。"); } if (Objects.isNull(uri)) { throw new IllegalArgumentException("URIが空です。"); } try { AccessAuthorization auth = accessAuthorizationMapper.findAuthUri(roleName, uri); if(auth != null) { return true; //アクセス許可 }else { return false; //アクセス拒否 } }catch(EmptyResultDataAccessException e) { return false; } } }

DbUserDetails

public class DbUserDetails implements UserDetails { private final Account account; private final Collection<GrantedAuthority> authorities; public DbUserDetails(Account account,Collection<GrantedAuthority> authorities) { this.account = account; this.authorities = authorities; } public Collection<? extends GrantedAuthority> getAuthorities() { return authorities; } public String getPassword() { return account.getPassword(); } public String getUsername() { return account.getUserName(); } public boolean isAccountNonExpired() { return true; } public boolean isAccountNonLocked() { return true; } public boolean isCredentialsNonExpired() { return true; } public boolean isEnabled() { return true; } public Account getAccount() { return account; }

AccessAuthorizationMapper

<select id="findAuthUri" resultType="com.rookie.sharebook.entity.AccessAuthorization"> SELECT ROLENAME, URI FROM ACCESS_AUTHORIZATION WHERE ROLENAME = #{roleName} <if test='roleName == "*"'> AND URI = #{uri} </if> <if test='roleName != "*"'> AND URI LIKE CONCAT(SUBSTRING(#{uri},1,6),'%') </if> </select>

WebSecurityConfig

public class WebSecurityConfig extends WebSecurityConfigurerAdapter{ //~省略 @Autowired AccessDecisionVoter<FilterInvocation> myVoter;   public AccessDecisionManager createAccessDecisionManager() { return new AffirmativeBased(Arrays.asList(myVoter)); } //~省略

補足情報(FW/ツールのバージョンなど)

Spring Boot <version>2.5.6

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Spring Security

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

ユニットテスト

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

Spring Boot

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