yuusuke-roughの日記

Java,SpringBoot,趣味等

認可処理で弾かれた時のエラー処理 in Spring Security

はじめに

今回は、今まで使用していた自前の認可処理を削除します。

そして、前回のカスタム認可に対して、参加者以外がルームURLにアクセスしようとした時の処理を実装します。

 

内容

 

参考:

アーキテクチャー :: Spring Security - リファレンス

Spring Security 使い方メモ CSRF - Qiita

HTTPステータスコード 完全に理解した - Qiita

 

状況:認可に弾かれる場合:例えば、参加者でないユーザーがルームのリンクを直接貼って拒否されると、Forbidden ステータスコード403を返す。

 

アーキテクチャー:: Spring Security - リファレンスの「セキュリティ例外の処理」参照

それが AccessDeniedException の場合、アクセスが拒否されますAccessDeniedHandler は、拒否されたアクセスを処理するために呼び出されます。

AccessDeniedHandler (spring-security-docs API) - Javadoc

 

 

DeniedAccessRoomHandler.java

 

public class DeniedAccessRoomHandler  implements AccessDeniedHandler{
    
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException {

      
        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
        response.setContentType("text/html; charset=UTF-8");
        try (PrintWriter writer = response.getWriter()) {
            
            writer.println("不正なリクエストです。");
        }
        
    }
    
}

 

config.java

 

http.authorizeHttpRequests(authorize -> 
                authorize.requestMatchers...

...

.exceptionHandling().accessDeniedHandler(new DeniedAccessRoomHandler());

 

上記構成に、accessDeniedPage(String url)を加えるとステータスコードが200を返してしまい、AccessDeniedHandlerを呼び出さない。

ExceptionHandlingConfigurer (spring-security-docs API) - Javadoc

 

...

.exceptionHandling(exceptionhandling -> exceptionhandling.accessDeniedHandler(new DeniedAccessRoomHandler()).accessDeniedPage("/joinRoom"))

 

に変更で、ステータス403を返し、指定したURLを表示する事ができた。

 

感想

以上、例外処理の動作確認でした。

ステータスコードや例外処理については、Csrfトークンの処理等で適宜触れてきた。

しかし、「適切な実装ができているか」と振り返ると適切とは言い難いと思う。

また、いくら調べども答えがでない事はもちろんだが、時間が足りない。

 

そこで、基礎の見直しを行いたいと思う。基礎見直し後に、改めて今回の実装を再開する。

一旦、実装にかける時間を下記に割く。

①Spring 解体新書

②プロになるJavaJava Gold対策

 

Java Goldについては、春の転職で客先面談の機会もでてくると思うが、アピールできる資格という意味でもあった方が良いと思う。

 

関係のない話

気付いたら、はてなブログLinux学習の記録の下書きがありました。

ノートパソコンにUbuntuをインストールして、コマンドを試しただけの記録なので、特に投稿する必要も感じられず没になったのでした。

 

昨日は、プログラミング以外に必要な資格取得のため、朝からお昼過ぎまで出かけておりました。移動時間は、個人Webサービスのお話をQiitaや個人ブログ、ラッコM&A等を通して読みました。プログラミングの話はもちろんですが、SEO対策やマネタイズの話もあり、興味深いです。

 

また、「はっと目覚める確率」を始めました。

昔、青チャートで解いたような気のする問題が多いですが、この本を始めてから別解を考えるのが楽しくなりました。

数列あたりの知識も抜けているので、流れとしては、数年かけて、確率・場合により数列→微分積分線形代数→統計か確率論を考えています。

業務の学習やアプリ開発に時間を割きたいので、一日一時間を上限とします。

 

マスタリングTCP/IPでは、業務でお馴染みだった光回線のお話があって面白いです。こちらも1時間を目安に読み進めていきます。目標は、概要の理解に留めます。