🐈

開発用認証機能を整備してみる

2024/04/22に公開

こんにちは!
オアシステクノロジーズの山本です。

システム開発において、SSO(Single Sign-On)を実現することは、よくある話です。
その場合、現行の認証基盤にのっかることが大半かと思います。

認証基盤とスムーズに調整、実連携が行えればよいのですが。インフラ上の制約であったり、認証基盤システム側の対応待ちなど。プロジェクト進行へのクリティカルパスになるなんてことも。。。

アプリケーション開発においては、根幹となりえるセキュリティ、ユーザー認証、権限管理への影響が懸念されるので、早めにクリアしておきたいところです。

今回はSSO認証したいけど、認証基盤連携がまだきない。
けど、開発は進めたいという場合の逃げ道整備をしていきたいと思います。

前提

  1. 【注意】あくまで開発向けの暫定認証ルートの構築が目標
  2. Spring Boot + Spring security による認証FWを使用
  3. 任意のコントローラーから、SecurityContextHolderに直接設定

※SecurityContextHolder は、Spring Security が認証されたユーザーの詳細を格納する場所です。
※参考程度でお願いします。
spring boot:3.15
spring security:6.1.5

実装イメージ

    @RequestMapping("/setAuth")
    public String setAuth(HttpServletRequest request) {
        // 認証情報を作成
        User principal = new User("username", "password", true, true, true, true, null);
        Authentication authentication = new UsernamePasswordAuthenticationToken(principal, null, principal.getAuthorities());

        // SecurityContextを作成し、認証情報を設定
        SecurityContext securityContext = SecurityContextHolder.createEmptyContext();
        securityContext.setAuthentication(authentication);

        // HttpSessionSecurityContextRepositoryを使用してセキュリティコンテキストを保存
        HttpSessionSecurityContextRepository contextRepository = new HttpSessionSecurityContextRepository();
        contextRepository.saveContext(securityContext, request, null);
        
        // ビジネスロジックで使用するセッション情報を設定
        String sessionValue = "sample-ession-value"
        WebUtils.setSessionAttribute(request,"session-key",sessionValue);
        

        return "Authentication set successfully!";
    }

※ UsernamePasswordAuthenticationToken を Saml2Authentication等のSSO方式に合わせた認証クラスに適宜変更をお願いします。

※ 公式リファレンス(執筆時の最新 6.2.3)
https://spring.pleiades.io/spring-security/reference/servlet/authentication/architecture.html

まとめ

あくまで開発用の暫定機能です。本番環境では適切なAuthenticationManager/provider を使用しFWの規定に沿った認証処理を行うようにしましょう。

Discussion