最近、私はアプリプロジェクトに取り組んでいました。バックグラウンドで単独で開発しました。ログイン、登録、および許可の確認の基本的な機能は、開発タスクの順序で開発の第1段階には含まれていません。現在、いくつかのビジネス関連機能が完了していますが、ユーザーポータルはまだ実装されていません。これは、要件を最初に分析し、最も基本的なユーザーポータルを後ろに置いたとき、私があまりにも心配していたことを示しています。
これで、既存のコードに基づいてユーザーログインと許可確認機能を追加する必要があります。
ログインと許可の確認に関して、以前のiOS開発エクスペリエンスを参照すると、アプリ側はトークンの交換にユーザー名とパスワードを提供し、交換されたトークンを介した各リクエストにログイン許可が必要です。
さて、一方で、次の問題を考慮する必要があります。
1.既存の関数のコードでこれらの機能の実装を簡単に満たす方法を使用して、既存のコードがあまり変更されておらず、将来の許可確認を実装する手間はありません。
2.ユーザー名とパスワードに基づいてトークンを生成する方法、およびアクセス許可を必要とする機能のトークンを提供するクライアントの正確性を区別する方法
まず、経験によれば、最初の問題に直面して、従来のソリューションはフィルターとインターセプターです。後の関数のURLに特定のパターンが与えられている限り、ログインと許可の検証が要件配置に配置された場合、フィルターまたはインターセプターの使用が成功します。しかし今、私は初期段階で設計や仕様のないURLに直面しているので、フィルターやインターセプターの使用に直面したくありません。
上記の従来のソリューションに加えて、Spring AOPはこのタイプの問題を解決するための武器になりました。フェイステンジェントプログラミングを使用して、許可確認を必要とするすべての方法に事前通知を提供します。ただし、URL、クラス名、またはメソッドは規則的ではないため、カスタムアノテーションを考え、カスタム注釈を追加するすべてのメソッドの権限を検証しました。
1. Spring AOPの使用をすでに考えているので、最初のステップはSpring構成ファイルでAOPを有効にすることです
// AOPを開きます
<aop:aspectj-autoproxy />
上記の構成は、スプリングAOP関連のJARパッケージをプロジェクトに注ぐこと、構成ファイルヘッダーにAOPのURLを導入することに基づいています。
2。次に、最初にカスタムアノテーションを定義しましょう
@target({elementType.Method、elementType.type}) @retention(retentionPolicy.runtime)public @interface useraccess {}3.トークンがまだ解決策を生成していないため、許可確認機能を実行することはできません。
トークンの生成を行うには、シングルサインオンが考慮されるため、トークンを常に修正できません。それ以外の場合は、トークンがある限り、少なくとも2人が同時に同じアカウントを使用できますが、現在は当社のビジネスでは許可されていません。最終的に、「ユーザー名 +パスワード +ログイン時間」を選択して、MD5暗号化をトークンとして実行しました(一意性と安定性を確保する際のUUIDなど、多くの方法があります)。ユーザー名とパスワードが正常に検証されたときにトークンを生成し、トークンを「ユーザー名:トークン」と「トークン:ユーザー」(データベースに保存することもできます)のキー価値ペアの形で保存し、クライアントにトークンを返します。
次のコードは単純な例です。
@servicepublic loginservice {/*** store "user name:token" key-valueペア*/public static map <string、string> tokenmap = new hashmap <string、string>();/*** store "token:user" key-valueペア*/public static map <string、user> loginmap = new hashmap <string、user>(); public String Login(String name、String Password){System.out.println(name+"-----"+password);/***ログインが成功したかどうかを確認*1。ログインに正常に* 1.1。対応するトークンと更新 * 1.2を正常に生成します。失敗した場合、例外をスローします*/string token = tokenmap.get(name); user user = null; if(token == null){user = new user(); user.setname(name); user.setpassword(password); system.out.println( "new user login ");} else {user = loginusermap.get(token); loginusermap.remove(token); system.out.println("ユーザーログイントークン ");} token = md5util.md5(name+password+new Date()。 token); system.out.println( "現在"+tokenmap.size()+"users");4。同時に、クライアントはログイン後にトークンを取得しました。許可を必要とするすべてのリクエストでトークンを運ぶ限り、応答を正常に取得することができます(提案:アプリのエンコードを促進するために、トークンをリクエストヘッダーに携帯することができます。実験を行う方法を見つけました。
@controller@requestMapping( "/login")public class logincontroller {@autowiredprivate loginservice loginservice; @useraccess @requestmapping(value = "/loginin"、method = requestmethod.get)public @responsebody string login(httpservletrequest request){string name = request.getParameter( "name"); string password = request.getParameter( "password"); string token = loginervice.login(name); retrion大胆な部分は、注釈をカスタマイズすることであることに注意してください。ログイン関数のリクエストパラメーターにトークンを使用することは不可能であるため、検証された回数に関係なく、渡すことはできません。例を挙げてください。 @UserAccess ADDは、許可確認を必要とする機能上でのみ動作します
5.カスタムアノテーションはこれで良いエントリポイントになりました
@component@aspectpublic class permirmentsaspect {//カスタムアノテーションをエントリポイント@before( "@annotation(com.example.chap01.annotation.useraccess)")public void checkpermission(joinpoint joinpoint)throws {system.out.out.println( "pre-notification"); joinpoint.getargs(); httpservletrequest request =(httpservletrequest)args [0]; string token = request.getParameter( "token"); system.out.println( "pre-notification token:"+token); user user = loginservice.loginusermap.get(token); if(user == null){system.out.println( "検証は渡されない!");新しい例外をスロー( "許可なし");}}}}}}この時点で、ログインと許可確認機能がすべて完了します。
さらに、個人のgithubのソースコードが添付されています:https://github.com/zw201913/applogin.git
上記はこの記事に関するものです。すべての人の学習に役立つことを願っています。