XXL-SSO 複数ログインタイプの詳細解説

XXL-SSO 複数ログインタイプの詳細解説

XXL-SSOは、多様なビジネスシナリオのニーズに応えるための多様なログインタイプをサポートする強力なシングルサインオンソリューションです。本稿では、Web通常ログイン、ネイティブログイン、およびCASシングルサインオンの実装原理、構成方法、およびコード例を詳しく紹介し、開発者が迅速に統合して利用できるよう支援します。

Web通常ログインの実装と構成

XXL-SSOは多様なログインタイプをサポートしており、その中でWeb通常ログインは従来の単一システムシナリオに最も適した一般的な方式です。本節では、Web通常ログインの実装原理、構成方法、およびコード例を詳しく説明し、開発者が迅速に統合して利用できるよう支援します。

実装原理

Web通常ログインの核心はFilterまたはInterceptorによるリクエストのインターセプトと、ユーザーログイン状態の検証です。XXL-SSOは、Servlet環境とSpring環境のそれぞれに対応したXxlSsoWebFilterXxlSsoWebInterceptorの2つの実装方式を提供しています。

核心コンポーネント
  1. XxlSsoWebFilter ServletベースのFilter実装で、従来のWebアプリケーションに適しています。
public class XxlSsoWebFilter implements Filter {
    private static final Logger logger = LoggerFactory.getLogger(XxlSsoWebFilter.class);
    private String bypassPaths;
    private String signInUrl;

    public XxlSsoWebFilter(String bypassPaths, String signInUrl) {
        this.bypassPaths = bypassPaths;
        this.signInUrl = signInUrl;
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) {
        // ログイン検証ロジック
    }
}
  1. XxlSsoWebInterceptor SpringベースのInterceptor実装で、Spring BootまたはSpring MVCプロジェクトに適しています。
public class XxlSsoWebInterceptor implements HandlerInterceptor {
    private static final Logger logger = LoggerFactory.getLogger(XxlSsoWebInterceptor.class);
    private String bypassPaths;
    private String signInUrl;

    public XxlSsoWebInterceptor(String bypassPaths, String signInUrl) {
        this.bypassPaths = bypassPaths;
        this.signInUrl = signInUrl;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // ログイン検証ロジック
    }
}
ログインフロー
  1. ユーザーがリクエストを発行すると、XxlSsoWebFilterまたはXxlSsoWebInterceptorがリクエストをインターセプトします。
  2. リクエストパスが除外リストに含まれているか(例: /static/**)を確認し、含まれている場合は通過させます。
  3. リクエストからログイン認証情報(Token)を抽出し、その有効性を検証します。
  4. 検証に失敗した場合はログインページにリダイレクトし、成功した場合はリクエストを通過させます。

構成方法

1. 依存関係の追加

pom.xmlにXXL-SSOの核心依存関係を追加します:

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-sso-core</artifactId>
    <version>{最新バージョン}</version>
</dependency>
2. 設定ファイル

application.propertiesに以下のパラメータを構成します:

# ログイン認証情報の転送キー
xxl-sso.token.key=xxl_sso_token
# ログイン認証情報のタイムアウト時間(ミリ秒)
xxl-sso.token.timeout=604800000
# Redis設定(ログイン状態の永続化用)
xxl-sso.store.redis.nodes=127.0.0.1:6379
xxl-sso.store.redis.keyprefix=xxl_sso_user:
# 除外パス
xxl-sso.client.bypass.paths=/weblogin/*,/static/**
# ログインページパス
xxl-sso.client.login.path=/weblogin/login
3. コンポーネントの登録

Spring設定クラスでXxlSsoBootstrapXxlSsoWebInterceptorを登録します:

@Configuration
public class XxlSsoConfig implements WebMvcConfigurer {
    @Value("${xxl-sso.token.key}")
    private String tokenKey;
    @Value("${xxl-sso.token.timeout}")
    private long tokenTimeout;
    @Value("${xxl-sso.store.redis.nodes}")
    private String redisNodes;
    @Value("${xxl-sso.store.redis.keyprefix}")
    private String redisKeyprefix;

    @Bean(initMethod = "start", destroyMethod = "stop")
    public XxlSsoBootstrap xxlSsoBootstrap() {
        XxlSsoBootstrap bootstrap = new XxlSsoBootstrap();
        bootstrap.setLoginStore(new RedisLoginStore(redisNodes, null, null, redisKeyprefix));
        bootstrap.setTokenKey(tokenKey);
        bootstrap.setTokenTimeout(tokenTimeout);
        return bootstrap;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new XxlSsoWebInterceptor(
            "${xxl-sso.client.bypass.paths}",
            "${xxl-sso.client.login.path}"
        )).addPathPatterns("/**");
    }
}
コード例
ログイン検証

Controllerで@XxlSsoアノテーションまたはAPI方式を使用してログイン状態を検証します:

@RestController
public class UserController {
    @GetMapping("/user/info")
    @XxlSso
    public Response<String> getUserInfo(HttpServletRequest request) {
        LoginInfo loginInfo = XxlSsoHelper.loginCheckWithAttr(request).getData();
        return Response.ofSuccess("ユーザー情報:" + loginInfo.getUserName());
    }
}
権限検証

@XxlSsoアノテーションのpermissionまたはrole属性を使用して権限またはロールを検証します:

@GetMapping("/admin/dashboard")
@XxlSso(permission = "admin:access")
public Response<String> adminDashboard() {
    return Response.ofSuccess("管理者パネルへようこそ");
}

上記の手順により、Web通常ログインの統合と構成を迅速に実現できます。XXL-SSOは柔軟な拡張能力を提供しており、開発者は実際のニーズに応じてログインロジックをさらにカスタマイズできます。

ネイティブログインの適用シナリオと実装詳細

XXL-SSOは多様なビジネスシナリオのニーズに応えるための多様なログインタイプをサポートしており、その中でネイティブログインはCookieなし環境向けに設計されたログイン方式であり、モバイル端末、ミニプログラム、フロントエンド/バックエンド分離システムなどのシナリオに適しています。以下では、ネイティブログインの適用シナリオとその実装詳細を詳しく説明します。

適用シナリオ

  1. モバイルアプリケーション ネイティブログインはAndroidおよびiOSプラットフォームに適したモバイルアプリケーションを原生的にサポートし、Cookieメカニズムに依存しません。
  2. フロントエンド/バックエンド分離アーキテクチャ Vue、Reactなどのフレームワークを使用するフロントエンドと、APIサービスを提供するバックエンドを持つプロジェクトでは、ネイティブログインはTokenメカニズムによる認証を実装し、このようなアーキテクチャに完璧に適合します。
  3. ミニプログラムとクライアントアプリケーション ミニプログラムとデスクトップクライアントは通常、Cookieを直接使用できないため、ネイティブログインはTokenによる認証情報の伝達を実装し、この問題を解決します。
  4. クロスドメインシナリオ ネイティブログインはCookieに依存しないため、ドメイン制限を受けず、クロスドメインシナリオに適しています。

実装詳細

核心コンポーネント

ネイティブログインの核心コンポーネントには、Servlet環境とSpring環境でのログイン認証に使用されるXxlSsoNativeFilterXxlSsoNativeInterceptorが含まれます。

  1. XxlSsoNativeFilter これはリクエストをインターセプトしてTokenを検証するServletフィルターです。その核心ロジックは以下の通りです:
public class XxlSsoNativeFilter implements Filter {
    private static final Logger logger = LoggerFactory.getLogger(XxlSsoNativeFilter.class);

    public XxlSsoNativeFilter(String bypassPaths) {
        // 初期化ロジック
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        // Token検証ロジック
    }
}
  1. XxlSsoNativeInterceptor これはSpring Bootプロジェクトに適したSpringインターセプターです。その構成例は以下の通りです:
@Override
public void addInterceptors(InterceptorRegistry registry) {
    XxlSsoNativeInterceptor webInterceptor = new XxlSsoNativeInterceptor(bypassPaths);
    registry.addInterceptor(webInterceptor).addPathPatterns("/**");
}
認証フロー

ネイティブログインの認証フローは以下の通りです:

  1. クライアントによるログインリクエストの発行 クライアントはAPIを介してユーザー名とパスワードを送信し、バックエンドが検証に成功するとTokenを生成してクライアントに返します。
  2. Tokenの保存と伝達 クライアントはTokenをローカル(LocalStorageまたはメモリなど)に保存し、後続のリクエストではHeaderまたはQueryパラメータを介してTokenを伝達します。
  3. サーバー側でのToken検証 サーバー側はXxlSsoNativeFilterまたはXxlSsoNativeInterceptorを介してリクエストをインターセプトし、Tokenの有効性を検証します。
  4. ログイン状態の管理 ログイン状態はRedisLoginStoreまたはLocalLoginStoreを介して永続化され、分散環境でのセッション共有をサポートします。
コード例

以下はネイティブログインのコード例です:

@RestController
@RequestMapping("/api")
public class AuthController {

    @PostMapping("/login")
    public Response<String> login(@RequestBody LoginRequest request) {
        // ユーザー名とパスワードの検証
        if ("admin".equals(request.getUsername()) && "123456".equals(request.getPassword())) {
            String token = TokenHelper.generateToken();
            return Response.ofSuccess(token);
        }
        return Response.ofFail("ログインに失敗しました");
    }

    @GetMapping("/profile")
    @XxlSso
    public Response<AccountInfo> getProfile(HttpServletRequest request) {
        LoginInfo loginInfo = XxlSsoHelper.loginCheckWithAttr(request).getData();
        return Response.ofSuccess(loginInfo.getAccountInfo());
    }
}

まとめ

ネイティブログインはXXL-SSOにおいてCookieなし環境向けに設計された効率的なログインソリューションであり、モバイル端末、フロントエンド/バックエンド分離、ミニプログラムなどの多様なシナリオに適しています。その核心実装はTokenメカニズムとインターセプター/フィルターに依存しており、開発者は既存のプロジェクトに簡単に統合できます。

CASシングルサインオンのアーキテクチャとデプロイ

XXL-SSOは、多システムクロスドメインや企業多システム統一ログインなどのシナリオに対応するCAS(Central Authentication Service)シングルサインオンをサポートしています。本節では、CASシングルサインオンのアーキテクチャ設計とデプロイフローを詳しく説明します。

アーキテクチャ設計

CASシングルサインオンの核心アーキテクチャは以下の部分に分けられます:

  1. 認証センター(CAS Server) ユーザーログイン認証を統一して管理し、ログイン認証情報(Ticket)の生成と検証を担当します。
  2. クライアント(CAS Client) 各ビジネスシステムに統合され、未ログインリクエストをインターセプトして認証センターにリダイレクトし、同時にTicketの有効性を検証します。

以下は典型的なCASシングルサインオンフローチャートです:

核心コンポーネント

1. XxlSsoCasFilter

XxlSsoCasFilterはCASシングルサインオンの核心フィルターであり、未ログインリクエストをインターセプトして認証センターにリダイレクトし、同時にTicketの有効性を検証します。その主要なメソッドは以下の通りです:

public class XxlSsoCasFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        // 1. ログイン状態のチェック
        // 2. 未ログインの場合はCAS Serverにリダイレクト
        // 3. Ticketの検証とセッションの作成
    }
}
2. XxlSsoBootstrap

XxlSsoBootstrapはXXL-SSOの起動クラスであり、ログイン状態保存コンポーネント(Redisなど)の初期化とグローバルパラメータの構成を担当します。以下は典型的な構成例です:

@Bean(initMethod = "start", destroyMethod = "stop")
public XxlSsoBootstrap xxlSsoBootstrap() {
    XxlSsoBootstrap bootstrap = new XxlSsoBootstrap();
    bootstrap.setLoginStore(new RedisLoginStore(redisNodes, redisUser, redisPassword, redisKeyprefix));
    bootstrap.setTokenKey(tokenKey);
    bootstrap.setTokenTimeout(tokenTimeout);
    return bootstrap;
}

デプロイフロー

1. 認証センター(CAS Server)の構成

認証センターは個別にデプロイする必要があり、以下は重要な構成項目です:

構成項目 説明
serverAddress 認証センターのアドレス、例: http://xxlssoserver.com
loginPath ログインページのパス、例: /login
bypassPaths 除外パス、例: /static/**
2. クライアント(CAS Client)の統合

ビジネスシステムにXxlSsoCasFilterを統合し、以下のパラメータを構成します:

構成項目 説明
serverAddress 認証センターのアドレス
loginPath ログインページのパス
bypassPaths 除外パス

以下は典型的なクライアント構成例です:

@Bean
public FilterRegistrationBean<XxlSsoCasFilter> xxlSsoFilterRegistration(XxlSsoBootstrap bootstrap) {
    XxlSsoCasFilter casFilter = new XxlSsoCasFilter(serverAddress, loginPath, bypassPaths);
    FilterRegistrationBean<XxlSsoCasFilter> registration = new FilterRegistrationBean<>();
    registration.setFilter(casFilter);
    registration.addUrlPatterns("/*");
    return registration;
}
3. 検証フロー
  1. ユーザーが保護リソースにアクセスすると、クライアントはログイン状態をチェックします。
  2. 未ログインの場合は認証センターにリダイレクトします。
  3. ユーザーが認証センターでログインすると、Ticketを携えてクライアントに戻ります。
  4. クライアントはTicketを検証してセッションを作成します。
コード例

以下はビジネスシステムでCASシングルサインオンを使用する簡単なコントローラーの例です:

@Controller
public class IndexController {
    @RequestMapping("/")
    public String index(Model model, HttpServletRequest request) {
        // ログイン状態のチェック
        Response<LoginInfo> loginCheckResult = XxlSsoHelper.loginCheckWithAttr(request);
        if (loginCheckResult.isSuccess()) {
            model.addAttribute("userName", loginCheckResult.getData().getUserName());
            return "index";
        } else {
            return "redirect:/login";
        }
    }
}

上記の手順により、CASシングルサインオン機能を迅速に実現し、多システム間のシームレスなログイン体験を確保できます。

マルチエンドログインとフロントエンド/バックエンド分離のサポート

XXL-SSOは強力なシングルサインオンソリューションであり、マルチエンドログインとフロントエンド/バックエンド分離アーキテクチャをサポートしています。本節では、XXL-SSOが多様なログインタイプと柔軟なアーキテクチャ設計を通じて、現代アプリケーションの多様なログインニーズを満たし、フロントエンド/バックエンド分離の開発モードをサポートする方法を詳しく説明します。

マルチエンドログインのサポート

XXL-SSOはWebログイン、ネイティブログイン、CASログインを含む多様なログインタイプをサポートしています。各ログインタイプは異なるアプリケーションシナリオに最適化されており、ユーザーが異なるデバイスでシームレスにログインできることを保証します。

1. Webログイン

Webログインは従来のブラウザアプリケーションに適しており、CookieとSessionメカニズムを通じてユーザー状態を保持します。XXL-SSOはXxlSsoWebFilterXxlSsoWebInterceptorの2つの方式を提供しており、開発者はプロジェクトのニーズに応じて適切な実装を選択できます。

// 例: Webログインフィルターの構成
@Bean
public FilterRegistrationBean<XxlSsoWebFilter> xxlSsoWebFilter() {
    FilterRegistrationBean<XxlSsoWebFilter> registration = new FilterRegistrationBean<>();
    registration.setFilter(new XxlSsoWebFilter());
    registration.addUrlPatterns("/*");
    return registration;
}
2. ネイティブログイン

ネイティブログインはモバイル端末またはデスクトップアプリケーションに適しており、Tokenメカニズムを通じてユーザー認証を実現します。XXL-SSOはXxlSsoNativeFilterXxlSsoNativeInterceptorを提供しており、Tokenの生成、検証、リフレッシュをサポートします。

// 例: ネイティブログインインターセプターの構成
@Configuration
public class XxlSsoConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new XxlSsoNativeInterceptor()).addPathPatterns("/api/**");
    }
}
3. CASログイン

CASログインは企業向けアプリケーションに適した集中型認証サービスです。XXL-SSOはXxlSsoCasFilterXxlSsoCasInterceptorを通じてCASプロトコルの統合を実現し、シングルサインオンとシングルログアウトをサポートします。

// 例: CASログインフィルターの構成
@Bean
public FilterRegistrationBean<XxlSsoCasFilter> xxlSsoCasFilter() {
    FilterRegistrationBean<XxlSsoCasFilter> registration = new FilterRegistrationBean<>();
    registration.setFilter(new XxlSsoCasFilter());
    registration.addUrlPatterns("/cas/*");
    return registration;
}

フロントエンド/バックエンド分離のサポート

XXL-SSOはTokenメカニズムとRESTful API設計を通じて、フロントエンド/バックエンド分離アーキテクチャを完璧にサポートします。以下はその核心実装方式です:

1. Tokenメカニズム

XXL-SSOはTokenをフロントエンド/バックエンド通信の認証情報として使用し、Tokenの生成と検証はTokenHelperクラスによって完了します。Tokenの有効期間とリフレッシュメカニズムは設定ファイルを通じて柔軟に調整できます。

// 例: Tokenの生成と検証
String token = TokenHelper.generateToken(userId);
boolean isValid = TokenHelper.verifyToken(token);
2. RESTful API設計

XXL-SSOは標準的なRESTful APIインターフェースを提供しており、フロントエンドはHTTPリクエストを介してバックエンドと対話できます。以下は一般的なAPI例です:

APIパス メソッド 説明
/api/login POST ユーザーログイン
/api/logout POST ユーザーログアウト
/api/validate GET Tokenの有効性検証
/api/refresh POST Tokenのリフレッシュ
3. クロスドメインサポート

XXL-SSOはCorsFilterの構成を通じてクロスドメインリクエストをサポートし、フロントエンド/バックエンド分離プロジェクトの正常な実行を保証します。

// 例: クロスドメインフィルターの構成
@Bean
public FilterRegistrationBean<CorsFilter> corsFilter() {
    FilterRegistrationBean<CorsFilter> registration = new FilterRegistrationBean<>();
    registration.setFilter(new CorsFilter());
    registration.addUrlPatterns("/*");
    return registration;
}

フローチャート例

以下はマルチエンドログインとフロントエンド/バックエンド分離のフローチャートです:

上記の設計により、XXL-SSOは柔軟にマルチエンドログインとフロントエンド/バックエンド分離の開発モードをサポートし、開発者に効率的で安全なシングルサインオンソリューションを提供します。

まとめ

XXL-SSOは柔軟なアーキテクチャ設計と多様なログインタイプのサポートを通じて、現代アプリケーションの多様なログインニーズを満たし、フロントエンド/バックエンド分離の開発モードを完璧に適合します。従来のWebアプリケーション、モバイルアプリケーション、企業向けの多システム統一ログインに関わらず、XXL-SSOは効率的で安全なソリューションを提供します。開発者は実際のニーズに応じて適切なログインタイプを選択し、迅速にシングルサインオン機能を実現できます。

タグ: XXL-SSO シングルサインオン Web認証 ネイティブ認証 CAS認証

6月15日 00:13 投稿