2

Java EE REST アプリケーションに独自の認証と承認を追加しようとしています。JAX-RS の実装 (JWT を使用) とエンドポイント メソッドの注釈を使用して、動作するバージョンを取得することができSecurityContextましContainerRequestFilter@RolesAllowed。しかし、EJB が必要であり、それらは JAX-RS の SecurityContext をまったく使用しないため (EJBAccessExceptionユーザーの役割に関係なく取得しています)、別の解決策が必要です。

SecurityContext実装可能なEJBのようなものはありますか? または、Shiro のようなライブラリを使用する必要がありますか? アプリケーション自体からユーザーを管理したいので、コンテナーまたは LDAP が提供するユーザー管理はオプションではありません。JPA を使用してユーザーの認証と承認を行っています。

したがって、主な質問は次のとおりです。

JAX-RS フィルターに基づいて、EJB で (@RolesAllowed アノテーションを使用して) 機能する独自の認証およびロールベースの承認メカニズムを実装するにはどうすればよいですか? リクエストがこれらのロールを持つ具体的な認証済みユーザーに関連していることを EJB に伝えるにはどうすればよいですか?

もう 1 つ、ベンダー固有のソリューションは避けたいと思いますが、必要であれば JBoss/Wildfly を使用します。

4

4 に答える 4

2

Principal現在のソリューションはオブジェクトを正しく設定していますか? これは、EJB を含む Java EE セキュリティの中心です。

通常、 JPA およびカスタム認証方法をサポートする認証 + IDMソリューションが必要です。PicketLinkはあなたの選択かもしれません。残念なことに、PicketLink は現在KeyCloakに取って代わられていると言われています。KeyCloak はアプリケーション内 IDM を提供しません。これは機能の重要な部分であり、まさにあなたが探しているものです。

JSR 375: Java™ EE Security APIは、標準的なベンダー中立の方法で上記のすべてに対処する新しい仕様です。Soteriaは JSR 375 RI です。現時点では、読み取り専用の ID ストアのみがサポートされています。

于 2016-03-26T19:20:51.367 に答える
1

REST Api で HTTP 認証ヘッダーを使用すると、コンテナの構成によって検証されると思います。これに関するJava EEベンダー中立の仕様がまだないという理由だけで、特定のベンダー固有の実装が存在するでしょう。ユーザーが検証されると、Principalが作成され、すべての EJB @RolesAllowed アノテーションが機能します。

DukesForest を Wildflyに移植したので、動作中の例を見ることができます。残りのサービスの dukes-payment を見て、web.xml と jboss-web.xml に注意してください。また、データベース構成の Entities プロジェクトを見てください。

基本的に、web.xml はセキュリティ制約を定義します。

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Secure payment service</web-resource-name>
        <description/>
        <url-pattern>/*</url-pattern>
        <http-method-omission>GET</http-method-omission>
    </web-resource-collection>
    <auth-constraint>
        <role-name>USERS</role-name>
    </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>BASIC</auth-method>
</login-config>
<security-role>
    <role-name>USERS</role-name>
</security-role>

また、Wildfly はsecurity-domain、データベースのクエリ方法を指定するために追加する必要があります。

<security-domain name="dukes-forest" cache-type="default">
    <authentication>
        <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
            <module-option name="dsJndiName" value="java:jboss/ForestXADS"/>
            <module-option name="rolesQuery" value="select NAME as 'ROLES', 'Roles' as 'ROLEGROUP' from forest.GROUPS g inner join forest.PERSON_GROUPS pg on g.ID = pg.GROUPS_ID join forest.PERSON p on p.EMAIL = pg.EMAIL where p.EMAIL = ?"/>
            <module-option name="hashAlgorithm" value="MD5"/>
            <module-option name="hashEncoding" value="HEX"/>
            <module-option name="principalsQuery" value="select PASSWORD from forest.PERSON where EMAIL=?"/>
        </login-module>
    </authentication>
    <authorization>
        <policy-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
            <module-option name="dsJndiName" value="java:jboss/ForestXADS"/>
            <module-option name="rolesQuery" value="select NAME as 'ROLE', 'ROLES' as 'ROLEGROUP' from forest.GROUPS g inner join forest.PERSON_GROUPS pg on g.ID = pg.GROUPS_ID join forest.PERSON p on p.EMAIL = pg.EMAIL where p.EMAIL = ?"/>
            <module-option name="hashAlgorithm" value="MD5"/>
            <module-option name="hashEncoding" value="HEX"/>
            <module-option name="principalsQuery" value="select PASSWORD from forest.PERSON where EMAIL=?"/>
        </policy-module>
    </authorization>
</security-domain>

これが基本的な考え方です。

PS> Web フレームワークにセキュリティを実装するJava Security Quickstart Archetypeもあり、上記の例に基づいて Http 基本認証を簡単に追加できるはずです。

于 2016-03-27T16:02:43.000 に答える