spring securityを使用する
つづいて、spring securityを使ってログイン画面を作ってみましょう。このspring securityを使うとbootstrap4で作られたログイン画面が勝手に表示されますので、その画面は作る必要がありません。その代わりいろいろと文章に書いてない約束事を守らないといけません。
先の項目まではネットで調べながらなんとかできましたが、ここは統一して説明してくれているサイトが少なく、あってもなんちゃってなので、困ったときの 「掌田津耶乃先生」で「Spring Boot3プログラミング入門」を見てやりました。
- 認証画面を出す
- ログインはできないもののとにかく認証画面を出すことができます
- データベースを使用する
- 例によってSQLServerに接続します
- 入れる場所と入れない場所
- どこに入れてどこに入れないかを設定します
- 最初のログイン
- 実験用のデータを作りログインしてみます
認証画面を出す
なにはともあれ「CTRL+SHIFT+P」でspring initializrを起動します。
Maven,3.3.1,java,17と選択して上のdependencyを入れてください。
今回はdependencyが多いです
- spring web
- tomcatを利用するアプリを作ります
- thymeleaf
- jspではなくhtmlでパラメータ渡しを行います
- spring security
- 認証を自動で行えるようにします
- h2 database
- 我々は使用しませんが内部で使用するようで必要です
- MS SQL(Microsoft SQLServer) driver
- 今回もSQLServerに接続します
これで収まらず、あと手入力で2つ追加してください
- webjars bootstrap
- 今回もbootstrap5を入れます
- SQLServer windows認証
- 接続でid,passwordを入れたくないのでwindows認証させます
なので結局pom.xmlは以下のようになります
どれも調べるのに苦労しました。先生と違うことしてるので仕方ないです。特に苦労したのはauthでこれはデフォルトではjarファイルを探しに行ってしまいますが、
Microsoftはdllファイルしか出していませんのでtypeをdllにしないといけません。versionはその時に合わせて変えてください。
ということで結構な数になってしまいました。
では、ログイン画面を作らないと、、、、いりません。これで起動して localhost:8080にアクセスすると認証画面が表示されます。が、なにもできません。
データベースを使用
では、今度はデータベースに接続する準備をしていきます。
このspring data jdbcを使うと、接続文字列をプログラム中に書かなくてよくなります。その代わりresourcesのapplication.propertiesに宣言を入れることになります。
1行目は初めから入っていますので、2行目3行目を書きます。ここでdatabaseNameのMydbはデータベース名で自分で作ったものです。ここにwindows認証で接続します。
続いてデータベース側の準備をするのでSQLServer management studioを起動します。
usersテーブルにusernameとpasswordとenabled、そしてauthoritiesテーブルにusernameとauthorityがあればよいようです。
実はデフォルトのユーザースキーマが決まっていて、これさえあればというものがあります。
基本がこれで、これに沿っていればいいようです。内容は後程プログラムで作成します。なぜならpasswordはbcryptで作らないといけないからです。
入れる場所と入れない場所
ようやく、プログラムに掛かります。
最初にinitializrで作ったソースは今回も何も触りません。そのままです。
そして、兄弟のクラスファイルを追加します。SampleSecurityConfig.javaを追加します。そしてアノテーションです。
@Configurationと@EnableWebSecurityを付けたクラスを作ります。
SecurityFilterChainを返すfilterChain()メソッドを作ります。ここでどこに入って良くてどこはだめというものを宣言します。
最初、index.htmlがどうしてもbootstrapが効かなくて困りましたが、/webjarsを許可してなかったのでbootstrapが効かなかったのでした。
このようにして、使えるurlをpermitAll()で許可していきます。
続いて、userDetailsを返すメソッドとuserDetailManagerを返すメソッドを宣言して、初回この3つのユーザーを追加します。
passwordに指定しているのはbcryptにencode()した暗号化されたpasswordです。これで初回ユーザーが出来たらコメントで止めましょう。
最後にコメント止めされているInMemoryUserDetailsManagerがありますが、データベースを使用せず、管理者だけログインできればいい時に使用してください。このサンプルがよくサイトに載っています。
最初のログイン
つづいて、また兄弟のクラスを追加します。SampleSecurityController.javaです。
こちらは@Controllerアノテーションを付けて、どのurlにGETしたら、どの処理をするのかを書きます
url localhost:8080/ にアクセスしたらindex()メソッドが起動されます。
MOdelAndViewクラスを使ってindex.htmlの呼び出しと、そこに渡すtitle変数とmsg変数を記述しています。
また、 localhost:8080/secret にアクセスしたら secret()メソッドが起動されます。secret.htmlの呼び出しとそこに渡すtitle変数とmsg変数を記述しています
つづいて、だれでもアクセスできるindex.htmlとlogin後だけアクセスできるsecret.htmlを記述します。
Clickでhrefで/secretへのアクセスを行いますが、ここは入れない場所なので認証が画面が表示され、そこを経由した場合だけsecretに行けます。
Mavenを使ってinstall,compile,packageしてspring boot dashboardから起動してみましょう。起動して localhost:8080にアクセスするとデータベースにユーザーが書き込まれます。
まずは、だれでも来ることができるindex.htmlです。ここから/secretに行こうとします。
しかし、secretは認証が必要な場所ですから、認証に飛ばされます
データベースに登録されたIDとpasswordでログインします
みごとに入ることができました。そしてlogoutすると
ログアウトされた画面に移動します
ちなみにusersテーブルの内容は
このようにpasswordのところに{bcrypt}と接頭語がついてpasswordが入っています。同様にauthoritiesテーブルは
今回はUSERロールしか作りませんでしたが、ADMINを作れば管理者権限を作ることができます。