JAAS

https://github.com/yukihane/hello-rest-environment の hello-wildfly-rest にサンプルコードを置いている。

WildFly設定 standalone/configuration/standalone.xml

standalone/configuration/standalone.xml の security サブシステム設定部分にsecurity-domainを追加:

        <subsystem xmlns="urn:jboss:domain:security:1.2">
            <security-domains>
                <security-domain name="own-domain" cache-type="default">
                    <authentication>
                        <login-module code="Database" flag="required">
                          <module-option name="dsJndiName" value="java:jboss/datasources/hello-wildfly-restDS"/>
                          <module-option name="principalsQuery" value="select email from Member where name = ?"/>
                          <module-option name="rolesQuery" value="select 'user', 'Roles' from Member where name = ?"/>
                        </login-module>
                    </authentication>
                </security-domain>
(後略)

login-module の code や module-option については前述のリンク先に説明がある。

`rolesQuery`についてはクエリの1項目目がロール、2項目目がロールグループだそうだが、2項目目はhttps://docs.jboss.org/author/display/WFLY10/Authentication+Modules[`Roles`固定でないといけない]らしい。

また、ここでは認証(authentication)だけ行いたく、認可(authorization)はアプリケーション独自で行う想定なので、1項目目も`user`固定としている。

WARで利用する

jboss-web.xml

WEB-INF ディレクトリ以下に jboss-web.xml ファイルを作成し、次の内容を記載する:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
  <security-domain>own-domain</security-domain>
</jboss-web>

web.xml

<web-app>
(前略)
  <security-constraint>
    <display-name>None Authorized Resource</display-name>
    <web-resource-collection>
      <web-resource-name>non-protected-page</web-resource-name>
      <description>認証不要リソース</description>
      <url-pattern>/rest/ejb/*</url-pattern>
      <url-pattern>/rest/login/*</url-pattern>
      <url-pattern>/rest/swagger.json</url-pattern>
    </web-resource-collection>
  </security-constraint>
  <security-constraint>
    <display-name>Authorized Resource</display-name>
    <web-resource-collection>
      <web-resource-name>protected-page</web-resource-name>
      <description>ログイン認証後に表示されるリソース</description>
      <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <description>認証完了したユーザが参照できるリソース</description>
      <role-name>user</role-name>
    </auth-constraint>
  </security-constraint>
  <login-config>
    <auth-method>FORM</auth-method>
    <realm-name>own-domain</realm-name>
    <form-login-config>
      <form-login-page>/rest/login/</form-login-page>
      <form-error-page>/rest/login/</form-error-page>
    </form-login-config>
  </login-config>
  <security-role>
    <role-name>user</role-name>
  </security-role>
</web-app>

EJB で利用する

jboss-ejb3.xml

<?xml version="1.0"?>
<jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee" xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:s="urn:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd
                     http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
  version="3.1" impl-version="2.0">

  <assembly-descriptor>
    <s:security>
      <ejb-name>*</ejb-name>
      <s:security-domain>own-domain</s:security-domain>
    </s:security>
    <method-permission>
      <unchecked />
      <method>
        <ejb-name>MyNonSecureEjb</ejb-name>
        <method-name>getText</method-name>
      </method>
    </method-permission>
    <method-permission>
      <unchecked />
      <method>
        <ejb-name>MemberRegistration</ejb-name>
        <method-name>register</method-name>
      </method>
    </method-permission>
    <method-permission>
      <role-name>user</role-name>
      <method>
        <ejb-name>*</ejb-name>
        <method-name>*</method-name>
      </method>
    </method-permission>
  </assembly-descriptor>
</jboss:ejb-jar>

認証不要にしたいものは ejb-name , method-name* にせず明示した上で <unchecked /> とする必要があった。 例えば method-name* にしてしまうと想定通り動かない( user ロール権限が必要になった)。