「Glassfish」カテゴリーアーカイブ

java ee ログインでのユーザー名の表示とログアウトさせる方法について

ユーザーログインを必要とするサイトを作るときにJava EEだと比較的に簡単に作れると思います。

Java eeでユーザー認証の機能を試してみました。

java ee でユーザー認証をderbyを使って行ってみる

これらのサンプルを試してみて、疑問に思うことがありました。

  • ユーザー名の表示はどうするのだろう。
  • ログアウトする方法

jsp /Servletで作った時はユーザー名は変数に割り当てていまししたし、ログイン状況の確認はクッキーを使用していたので特に何も考えなくても問題はありませんでした。

java eeの場合、ある程度その辺りについては部品化されているので、それを行うのにはコードが用意されているようです。

jspの場合

Java eeでユーザー認証の機能を試してみました。」を試してみるとadminでログインをした後にuserにログインし直したい場合、ブラウザーを閉じるなどしないとログインしなおせませんでした。

また、ロールごとに表示させるページを指定するのはweb.xmlでできるのですが、ユーザーごとに表示させる内容を変えたい場合にはユーザー名をシステム側で認識する必要があります。

ユーザー名を表すもの

私が試したのは

  • request.getRemoteUser()
  • request.getUserPrincipal().toString()

で、どちらもユーザー名が表示させることが出来ました。

HttpServletRequestを利用しているようですがjspの場合だと、明示的にインポートしなくてもそのまま利用できました。

ログアウトの方法

ログイン状態の管理はクッキーか、ローカルに何か情報を持っているのかとChromeで調べてみましたが、見つかりませんでした。

インターネットで調べてみたところ、

  • session.invalidate();

を実行することで、ログアウトはできるようになるようです。

セッションで管理していてセッションごと無効にすることで対応するみたいです。

JSFの場合

java ee でユーザー認証をderbyを使って行ってみる」の場合、JSFで作成されています。ユーザー名を調べる場合には

ログインユーザ名:<h:outputLabel value=”#{request.userPrincipal.name}”/>

とすることでユーザー名が表示されます。

このチュートリアルではログアウトでは、「<h:commandButton value=”ログアウト” action=”#{indexPage.logout()}”/>」で実現しています。このIndexPage.javaのlogout関数では

    public String logout() {
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        externalContext.invalidateSession();
        HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
        try {
            request.logout();
        } catch (ServletException ex) {
            Logger.getLogger(IndexPage.class.getName()).log(Level.SEVERE, null, ex);
        }
        // return "index.xhtml?faces-redirect=true";
        return "/faces/login/index.xhtml?faces-redirect=true";
    }

コードを読んでいくとJSPと同様にセッションを無効にしたあと、HttpServletRequestにはlogoutという関数を実行しているようです。

jspでもこの関数が使えるか試してみました。

<% session.invalidate();%>の代わりに<% request.logout(); %>を入れてみたところ想定通りに動きました。

まとめ

Java EEだとログインとそれに伴うログイン管理は入っているので開発は楽だなと思いました。

これらの情報は自分にとってはまとめられているようにも見えないのでちょっとずつ自分でも調べていきたいと思います。

関連リンク

glassfish – How can I get j_username on my index.jsp after successful authentication with j_security_check? – Stack Overflow

java – How to get login attributes from a servlet/jsp – Stack Overflow

How do I log out of an application that uses Form authentication? – Web Tutorials – avajava.com

java ee, JSFの簡単なチュートリアルから始めてみました。

Java eeでユーザー認証の機能を試してみました。」と「java ee でユーザー認証をderbyを使って行ってみる」でJava eeでできる認証について調べてみましたが、そもそも基本がわかっていないので、細かいところがわかりませんでした。

最初は「Java EE 7 入門 〜 NetBeansで始めるJavaEE7 First Tutorial #javaee7 #jjug #j…」をみてやったのですが、色々盛り込み過ぎていて理解しきれなかったのと、コードを見ながら書いたのですが、どこかで間違ったのか正常に動かなかったので、githubにあるソースを使い検証しました。jsf でのデータベースアクセスとwebsocketを利用したものでチュートリアルとしては素晴らしい物でした。

けど簡単なところから始めよう。

続きを読む java ee, JSFの簡単なチュートリアルから始めてみました。

java ee でユーザー認証をderbyを使って行ってみる

この前書いた記事ではglassfishにあるfile realmを利用してのログインを検証しました。fileベースなのでユーザーが増えた時や、利用者がパスワードを変更したい時などは何かと運用が難しいと思いました。

そこでjava ee でDerbyを利用したユーザー認証の例があるか検索したところ簡単に見つかりました。

たかがレルムされどレルム GlassFish で始める詳細 JDBC レルム | 寺田 佳央 – Yoshio Terada

またgithubなどでコードもあるので利用しました。

結果から言うと無事に動きました。以前、「エンタープライズシングルサインオン USO」の動作を説明するために動画を作ったのですが、その際にはJSP + Derbyで認証システムを構築しました。

デモ用なのでパスワードの暗号化などは行っていませんが、データベースと接続するための仕組みや、パスワードの変更などはDerbyと接続してSQL文で命令を作りました。

その時と比較するとJSFとかmavenとかの機能を利用したことは殆どなかったのですが結構簡単にできるのかなと思いました。

このチュートリアルで迷ったところ

とりあえずチュートリアルを作った時期にはNetbeans 8ではなかったので動作環境が違うからなのかちょっと変更した部分がありました。

うえの動画の認証の仕組みはとりあえずSQL文を直接実行する形になっているのでサーバー側の設定は必要がありませんでしたが、こちらのチュートリアルのP.29ではデータベースとの接続には接続「jdbc/__default」をしていたのですが私の環境ではなぜかうまくいかなかったのでデーターソースを作りなおしました。

20140521-s01

チュートリアル通りにしようと思うと上の画面が出てくました。そこでNetbeans データ・ソースを指定するとき「新しいデータ・ソース」を選択することで解消しました。

20140521-s02

ここから実際のデータ・ソースを選択してください。20140521-s03

ここで設定した内容についてはGlassFishの管理コンソールで簡単に確認できるかと思います。Web管理コンソールはNetbeansから起動できるのですがhttp://localhost:4848/にアクセスすれば利用できます。

そこで、左側のメニューから リソース→JDBCリソース、JDBC接続プールで確認できます。

なぜ上のようなエラーが表示されたのかはわかりませんが、今度またしらべて見たいと思います。

もう一つはp.94あたりで権限がないユーザーがアクセスした時に通常であれば403エラーが表示されるのですが、それは利用者にとってわからないのでそのエラーページ用のページを作成しています。

私が試してみたところ、このページが表示された時でも権限のないユーザーとしてはログインしているのでログインページに戻ってもこのページにアクセスすることになります。

そこで、このページが表示された時にログオフすることが必要だと思いました。

error-403.xhtmlに「<h:commandButton value=”ログアウト” action=”#{indexPage.logout()}”/>」を追加し、ログオフボタンを表示させました。

この場合、ボタンを押したらログオフができるのですが、ページが見つからないとエラーが出たので「IndexPage.java」のlogout()関数を調べると、「return “index.xhtml?faces-redirect=true”;」とありましたが、error-403.xhtmlがあるディレクトリーにindex.xhtmlがないのでエラーになるはずです。そこで「return “/faces/login/index.xhtml?faces-redirect=true”;」 としたところ期待した動きになりました。

チュートリアルでわかったこと

JSPとサーブレットだけでゴリゴリ書けば同じことができるのはわかっていたのですが、これほど高度なことをつくろうと思うと結構な手間がかかるような気がします。

ログインのパスワードもパスワードを生で入れているわけではなくハッシュで対応し、パスワードの検証ができるのは結構驚きました。

このチュートリアルでJSFやmavenなどに触れてみましたが、やはりいろいろなことをするのであればこのような技術について勉強したほうがいいなと思った次第です。

このチュートリアルでは認証だけでなくデーターベースへの追加の方法なども書いてあるのでコードを見てみて勉強してみたいと思いました。

 

Java eeでユーザー認証の機能を試してみました。

仕事柄「AccessMatrix USO」を扱っているのでユーザー認証の仕組みの作り方は知っているのですが、GlassFishでJava eeで比較的簡単にユーザー認証の仕組みが作れるようなので試してみました。

とりあえず認証ができたらということで「Securing a Web Application in NetBeans IDE」を参考にしてみました。

環境は、Netbeans 8.0/ GlassFish 4/ JDK 1.8.5で行いました。 続きを読む Java eeでユーザー認証の機能を試してみました。