saba1024のブログスマートフォン用の表示で見るsaba1024のブログどうでも良い思いついた事とかプログラミング関係のメモとか書いていきます。この広告は、90日以上更新していないブログに表示しています。2017の9日目の記事です。この記事は、以下の5つの投稿で成り立っています。APIを使ってGrailsとVue.js/axiosでCRUD操作を実装しました。なるとやはりログイン処理を実装したくなりますね。APIで利用可能な認証機構を追加していきます。前提条件Grailsで作成したアプリーションのディレクトリは今後$GRAILS_PROJECTとし、Vue.jsのアプリケーションのディレクトリはその直下なで$VUE_PROJECTと記述します。私の環境では、$GRAILS_PROJECTは/home/koji/work/grails/gvtodoで、$VUE_PROJECTは$GRAILS_PROJECT/frontendになっています。準備プラグインの追加$GRAILS_PROJECT/build.gradleのdependenciesに以下を追記します。下記のプラグインは2017/11/10の時点で最新のものです。"org.grails.plugins:spring-security-rest:2.0.0.M2"コレで、一旦Grailsを完全に終了して、インタラクティブモードからも抜けます。再度grailsコマンドを実行すれば、自動的に上記2プラグインがダウンロード、セットアップされます。API経由で認証出来るようにするプラグインとなります。ログインするユーザのIDとパスワード(とモロモロ)を管理する必要が有ります。これらはSpringSecurityCoreプラグインが提供してくれているs2-quickstartコマンド一発で生成できます。以下のようにコマンドを実行して、認証用のユーザ情報を保持するドメインなどを作成します。AuthRoleを実行してください。認証ロール名となります。認証ユーザとロールの作成(デフォルトのAdministrator)では、テスト用に初期ユーザを登録します。Bootstrap.groovyを以下のようにします。}}これでGrails起動時に常にこのログイン情報(ロールとユーザ)が作成されるようになりました。認証情報の設定Grails3がデフォルトで持っている設定ファイルはapplication.ymlですが、SpringSecurityCoreによって古い設定ファイル方式のapplication.groovyが生成されて、デフォルトの設定が自動的に記述されています。デフォルトでは以下のようになっています。'JOINED_FILTERS']]コレを以下のように修正します。'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter']]変更点の概要は大まかに以下のとおりですログアウトがデフォルトだとPOST限定なので、GETなどでも行えるようにする権限の確認方法をアノテーションベースからURLベースに変更SpringSecurityRESTの設定を追加SpringSecurityCoreがどのURLに対してどのロールを要求するのか設定grails.plugin.springsecurity.filterChain.chainMapこれはSpringSecurityRESTの為に追加しました。コード内にJOINED_FILTERSという項目が現れていますが、コレはどういった認証方法(Filter)をpattern(URI)に対して許可/利用するか、というものになります。SpringSecurityCoreによってJOINED_FILTERSには複数の認証方法が定義されていますが、SpringSecurityRESTによってさらにrestTokenValidationFilter、restExceptionTranslationFilterが追加されています。認証方法(Filter)から省いています。APIでの認証が可能になる、ということになります。'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter']で指定されている通り、SpringSecurityRESTで追加されたFilterを省いたモノすべて、つまり通常のSpringSecurityCoreプラグインでの認証方法、ということになっています。grails.plugin.springsecurity.interceptUrlMapこの設定はSpringSecurityCoreの設定で、どのURLがどのような認証/認可を行うのかというルールを指定します。'ROLE_ADMIN']],の部分です。/oauth/**には、アクセストークンの再発行の為にアクセスしますので、アクセストークン無しでアクセスできるようにpermitAllにしてあります。(このアクセストークンの再発行は明日の記事にて説明します。)/api/**、/manual/**に関しては、すでにログインしていて、ROLE_USERかROLE_ADMINのロールを持っているユーザのみアクセス可、としています。ココで1点分かりづらい部分が有るのですが、/api/**には、SpringSecurityRESTによって、loginlogoutvalidateの3つのURLがGrailsに追加されています。/api/**にアクセスするのにROLE_USERかROLE_ADMINが無いといけないという指定をしているので、そもそもログインしたいが為に/api/loginにアクセスしてもエラーになっちゃうのでは?と言う疑問が残ります。この部分はSpringSecurityRESTがうまいことやってくれていて、/api/loginへのアクセスは例外としてOK、という処理になっているようです。実際に以下のように各URLにcurlでアクセスすると、基本的に401エラーが返ってくるけど、/api/loginだけはエラーになりませんでした。コレで基本的に設定は完了です。Grailsをrun-appで起動して、実際に直接Grailsにアクセス(http://localhost:8080)してみるとログイン画面が表示されると思います。ログイン処理(Vue.js/axios)さて、それでは実際にログイン出来る用にアプリケーションを改良していきます。新たにログイン画面を作成します。SpringSecurityRESTがある前提。以下のURLにログイン情報を送信すると、認証情報が返る。}</script>ログインした情報を保持するユーザ情報の取り扱いログインしたユーザの情報を取り扱うsrc/UserInfo.jsを作成します。今回、フロントエンドで、サーバから受け取った認証情報はlocalStoageに保存するようにします。ソレを扱うためのsrc/UserInfoRepository.jsを作成します。}}ログインを必須にするそして全てのリクエスで必ず、ログインしているかどうかをチェックするように、src/router/index.jsを以下のように修正します。APIを利用して操作している部分で、認証用のトークンをヘッダーにセットするように変更します。SpringSecurityRESTでは、デフォルトでは認証情報をHTTPヘッダーのAuthritzationからBearer認証スキームを前提として抜き出します。HTTPリクエストヘッダーのAuthaorizationは以下のような形になります。{ログイン時にSpringSecurityRESTが返してくれたaccess_token}この辺りの詳細はRFCを参照してください。}</style>コレでアプリケーションに認証を機能を付けることが出来ました!GrailsとVueアプリケーションを起動してから、実際にhttp://localhost:8081にアクセスしてみてください。ログイン画面が表示されて、ログイン後操作できることを確認できると思います。APIベースの認証機構を追加することが出来ました。今回実装してはっきり解ると思いますが、トークン(access_tokenかrefresh_token)が第3者に漏れるとイコールアカウントを乗っ取られます。Encryptのように無料で簡単にSSLを導入することが出来ます。2017の11日目の記事です。2017の10日目の記事です。2017の8日目の記事です。2017の7日目の記事です。2017の1日目の記事です。月別アーカイブはてなブログをはじめよう!saba1024さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。