本格派エンジニアの工具箱

第22回 Apache Shiroを利用してWebアプリケーションに認証機構を組み込む

この記事を読むのに必要な時間:およそ 6 分

web.xmlへの記述内容は次のようになります。shiro.iniは上で掲載したものと同じで,これを/WEB-INF/ディレクトリに配置しましょう。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
			     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

  <filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
    <init-param>
      <param-name>configPath</param-name>
      <param-value>/WEB-INF/shiro.ini</param-value> 
    </init-param>
  </filter>

  <servlet>
    <servlet-name>Login</servlet-name>
    <servlet-class>jp.gihyo.toolbox.shiro.Login</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>Logout</servlet-name>
    <servlet-class>jp.gihyo.toolbox.shiro.Logout</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>Login</servlet-name>
    <url-pattern>/Login</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Logout</servlet-name>
    <url-pattern>/Logout</url-pattern>
  </servlet-mapping>
  
</web-app>

以上で完成です。Webサーバにデプロイしてブラウザから/user/content,jspにアクセスしてみましょう。/user/以下はauthcフィルタによって保護されたエリアなので,ログインしていない状態ではl/login.jspにリダイレクトされるはずです。/login.jspでは図1のように表示されるので,ここでユーザ名とパスワードを入力してログインしてください。

図1 ログインページの例

図1 ログインページの例

ログインに成功すると,図2のように/user/content.jspにアクセスできるようになります。

図2 ログインに成功すれば/user/以下のコンテンツにアクセスできる

図2 ログインに成功すれば/user/以下のコンテンツにアクセスできる

カスタムタグライブラリを使う

ShiroにはWebアプリケーションで使うためのJSP/GSP向けのカスタムタグライブラリが用意されています。これを利用することで,認証済みか否かで表示内容を変えるなどといった処理が簡単に記述できるようになります。

たとえば,userタグで囲まれた内容は,認証済みの場合にのみ表示されるようになります。逆に,未認証の場合にのみ表示したい内容がある場合にはgestタグを使うと便利です。次の例は,この2つのタグを使って認証済みか否かで表示内容を変えるものです。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Shiroサンプル - </title>
  </head>
  <body>
    
    <shiro:user>
      <p>こんにちは、<shiro:principal/> さん。</br>
      <shiro:principal/> さんではない場合は
      <a href="<c:url value='/Logout' />">ここ</a>をクリックしてログアウトしてください。</p>
    </shiro:user>

    <shiro:guest>
      <p><a href="<c:url value='/Logout' />">このページ</a>からログインしてください。</p>
    </shiro:guest>
    
  </body>
</html>

認証が行われていないユーザに対しては,図3のように表示されます。一方,認証済みであれば図4のような表示になります。principalタグは,Subjectオブジェクトのユーザ名を取得するカスタムタグです。

図3 guestタグの中身は未認証の場合にのみ表示される

図3 guestタグの中身は未認証の場合にのみ表示される

図4 userタグの中身は認証済みの場合にのみ表示される

図4 userタグの中身は認証済みの場合にのみ表示される

Webアプリケーションにユーザ認証は不可欠ですが,Apache Shiroを使えばこのように簡単にその仕組みを組み込むことができる上,コンテンツごとのアクセス権管理も容易に行えます。今回はユーザ情報の設定にINIファイルのみ使いましたが,各種レルムを導入すれば,LDAPやデータベースをはじめとしたさまざまな認証機構と組み合わせることもできるので,実用性は極めて高いと言えるでしょう。

著者プロフィール

杉山貴章(すぎやまたかあき)

ONGS Inc.所属のプログラマ兼テクニカルライター。雑誌,書籍,Webメディアで多数の著作をもつ。

著書