シロソースコード解析2

簡単な紹介

  • セキュリティマネージャ:セキュリティマネージャ、史郎のコアコンポーネント。シロセキュリティマネージャインスタンスによって内部コンポーネントを管理し、その安全管理を介してさまざまなサービスを提供します。
  • 認証:認証、認定AuthenticationTokenは有効です。
  • 承認者:承認者、役割と権限を扱います。
  • SessionManagerの:セッションマネージャ、管理セッション。
  • 件名:現在の操作体は、現在のユーザーを表します。
  • SubjectContext:件名コンテキスト・データ・オブジェクト。
  • AuthenticationToken:認証トークン情報(ユーザー名、パスワードなど)。
  • ThreadContext:スレッドコンテキストオブジェクトは、オブジェクトが現在のスレッドに結合する責任があります。

史郎の学習と使用の過程では、我々はすべてのSecurityManagerインタフェースは四郎の中で最も中央インタフェースである知っています。私たちは、この界面に沿って分析しました。

次のコードは、SecurityManagerのインタフェースを定義されています。

public interface SecurityManager extends Authenticator, Authorizer, SessionManager { /** * 登录 */ Subject login(Subject subject, AuthenticationToken authenticationToken) throws AuthenticationException; /** * 登出 */ void logout(Subject subject); /** * 创建Subject */ Subject createSubject(SubjectContext context); } 

これは、SecurityManagerの中に3つのメソッドを定義して、すなわち、ログインログアウトや件名を作成します。通常、私たちはこのように使用するために時間を使います。まず、ログインメソッドを呼び出すことにより、着信トークンを認証するためのログイン認証情報をSubjectオブジェクトを作成し、そして。

Subject subject = SecurityUtils.getSubject(); 
UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123"); subject.login(token); 

SecurityUtils分析

史郎での使用に便利なツールクラスSecurityUtilsを提供し、SecurityUtilsコア機能は、セキュリティマネージャと件名を得ることです。両方のインターフェイスは、開発時の使用のためにしろ周辺インターフェースが設けられています。

それは、アプリケーション内のSecurityManagerオブジェクトは、単一の存在であると言うことです、SecurityUtilsで定義された静的にSecurityManagerを使用してください。

private static SecurityManager securityManager;

1.取得のSecurityManager

最初はThreadContextから取得し、ない場合は、SecurityUtilsプロパティからのSecurityManagerを取得しました。これは、オブジェクトのSecurityManagerのインスタンスを存在する、または例外をスローする必要があります。

public static SecurityManager getSecurityManager() throws UnavailableSecurityManagerException { SecurityManager securityManager = ThreadContext.getSecurityManager(); if (securityManager == null) { securityManager = SecurityUtils.securityManager; } if (securityManager == null) { String msg = "No SecurityManager accessible to the calling code, either bound to the " + ThreadContext.class.getName() + " or as a vm static singleton. This is an invalid application " + "configuration."; throw new UnavailableSecurityManagerException(msg); } return securityManager; } 

2.取得件名

、存在して新しい件名を作成し、その後はThreadContextにあなたが得ることができるので、次の時間が保存されていない場合はまず、はThreadContextから取得しました。

public static Subject getSubject() { Subject subject = ThreadContext.getSubject(); if (subject == null) { subject = (new Subject.Builder()).buildSubject(); ThreadContext.bind(subject); } return subject; } 

buildSubject()メソッドは、テーマを作成するためにSubject.Builderクラスによって提供される上記のコードで重要です。あなたが作成するとSubjectオブジェクトもSubjectContext、その件名を作成し、それが一から一ですSubjectContextされます。次のコードは、Subject.Builderクラスのコンストラクタです。

public Builder(SecurityManager securityManager) { if (securityManager == null) { throw new NullPointerException("SecurityManager method argument cannot be null."); } this.securityManager = securityManager; // 创建了SubjectContext实例对象 this.subjectContext = newSubjectContextInstance(); if (this.subjectContext == null) { throw new IllegalStateException("Subject instance returned from 'newSubjectContextInstance' " + "cannot be null."); } this.subjectContext.setSecurityManager(securityManager); } 

buildSubject()メソッドは、実際のSecurityManagerインタフェースcreateSubject(SubjectContext subjectContext)法と呼ばれています。

public Subject buildSubject() { return this.securityManager.createSubject(this.subjectContext); } 

概要

この章のショーのSecurityManagerインタフェースcreateSubject(SubjectContext subjectContext)メソッド詳細な分析SecurityUtils.getSubject()の。また、私たちは、件名の分析に2つの方法の詳細な分析を行います。

また、当社は、SecurityManagerのセキュリティ管理を実現するためのさまざまなサービスを提供するようにSecurityManagerが、認証、オーソ、SessionManagerの3つのインターフェースを継承したでしょう。次の記事で分析したがオーセンティケータ、オーソ、SessionManagerのは、私たちは基本的に習得のSecurityManagerます。

おすすめ

転載: www.cnblogs.com/wzq-xf/p/11785101.html