2012年4月4日水曜日

grailsとjQuery MobileとSpring Security pluginでログイン画面を変更する

grailsとjQuery MobileとSpring Security pluginでログイン画面を変更するには、以下の手順を実行します。

1. ApplicationResources.groovyでモジュールを宣言
modules = {
    application {
        resource url:'js/application.js'
    }
    // jQuery mobileのモジュールを宣言
    jquerymobile {
      dependsOn 'jquery'
      resource url: 'js/jquery.mobile-1.1.0-rc.1.min.js', disposition:'head'
      resource url: 'css/jquery.mobile-1.1.0-rc.1.min.css'
    }
}
jquery.mobile-1.1.0-rc.1.min.jsはweb-app/jsに、jquery.mobile-1.1.0-rc.1.min.cssはweb-app/cssに 画像類はweb-app/css/imagesに配置します。

2. web-app/WEB-INF/sitemesh.xmlに以下のようにexcludes要素を追加します。
<sitemesh>
<!-- sitemesh除外 -->
<excludes file="/WEB-INF/sitemesh-excludes.xml" />
    <page-parsers>
        <parser content-type="text/html"
            class="org.codehaus.groovy.grails.web.sitemesh.GrailsHTMLPageParser" />
        <parser content-type="text/html;charset=ISO-8859-1"
            class="org.codehaus.groovy.grails.web.sitemesh.GrailsHTMLPageParser" />
        <parser content-type="text/html;charset=UTF-8"
            class="org.codehaus.groovy.grails.web.sitemesh.GrailsHTMLPageParser" />
    </page-parsers>

    <decorator-mappers>
        <mapper class="org.codehaus.groovy.grails.web.sitemesh.GrailsLayoutDecoratorMapper" />
    </decorator-mappers>
</sitemesh>
3. sitemesh-excludes.xmlを以下のように作成し、web-app/WEB-INF/に配置します。
<?xml version="1.0" encoding="UTF-8"?>
<sitemesh-excludes>
  <excludes>
    <pattern>/*</pattern>
  </excludes>
</sitemesh-excludes>
4. Spring Security pluginをインストールし、ユーザやロールなどのドメインクラスを作成します。
grails install-plugin spring-security-core
grails s2-quickstart <package> <user domain class> <role domain class>
5. 管理者用のユーザを作成するようにBootStrap.groovyに以下のようなコードを追加
import yourpackage.*
class BootStrap {

  def init = { servletContext ->
    def roleAdmin = Role.findByAuthority("ROLE_ADMIN")?: 
      new Role(authority:"ROLE_ADMIN").save(failOnError:true)

    def userAdmin = User.findByUsername("admin")?:
      new User(username: "admin", password: "admin",
        enabled:true).save(failOnError:true)

    if (!userAdmin.authorities.contains(roleAdmin)) {
      UserRole.create userAdmin, roleAdmin, true
    }
  }
  def destroy = {
  }
}
6. Config.groovyで以下のコードのようにURLに対してセキュリティを設定します。
import grails.plugins.springsecurity.SecurityConfigType
grails.plugins.springsecurity.securityConfigType = SecurityConfigType.InterceptUrlMap
grails.plugins.springsecurity.interceptUrlMap = [
  '/*':['IS_AUTHENTICATED_FULLY']
]
7. grails-app\views\loginのauth.gspを以下のように変更します。
<%=packageName%>
<!DOCTYPE html> 
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1"> 
  <title><g:message code="springSecurity.login.title"/></title>
  <style type="text/css" media="screen">
/* headerが...で省略されるのを防ぐ  */
body .ui-header .ui-title {
  white-space: normal;
  margin-left: 0;
  margin-right: 0;
}
  </style>
  <!-- jquerymobileを使用 -->
  <r:require module="jquerymobile"/>
  <r:layoutResources />
</head> 
<body>
  <div data-role="page">
    <div data-role="header">
      <h1><g:message code="springSecurity.login.header"/></h1>
    </div>
    <div data-role="content">
      <g:if test='${flash.message}'>
        <div class='login_message'>${flash.message}</div>
      </g:if>

      <form action='${postUrl}' method='POST' id='loginForm' autocomplete='off' data-ajax="false">
        <div data-role="fieldcontain">
          <label for='username'><g:message code="springSecurity.login.username.label"/>:</label>
          <input type='text' class='text_' name='j_username' id='username'/>
        </div>

        <div data-role="fieldcontain">
          <label for='password'><g:message code="springSecurity.login.password.label"/>:</label>
          <input type='password' class='text_' name='j_password' id='password'/>
        </div>

        <div id="remember_me_holder">
          <input type='checkbox' class='chk' name='${rememberMeParameter}' id='remember_me' <g:if test='${hasCookie}'>checked='checked'</g:if>/>
          <label for='remember_me'><g:message code="springSecurity.login.remember.me.label"/></label>
        </div>

        <div>
          <input type='submit' id="submit" value='${message(code: "springSecurity.login.button")}'/>
        </div>
      </form>
    </div>
  </div>
  <r:layoutResources />
<script type='text/javascript'>
  <!--
  (function() {
    document.forms['loginForm'].elements['j_username'].focus();
  })();
  // -->
</script>
</body>
</html>
出力画面

動作環境
grails 2.0.1

関連情報
jQuery mobileのホームページ
http://jquerymobile.com/

0 件のコメント:

コメントを投稿