web-dev-qa-db-ja.com

Webアプリケーションで動作する@RolesAllowedアノテーションを取得するにはどうすればよいですか?

Backbone.js、Bootstrap、NetBeansを使用してWebアプリケーションを作成していますIDE 8.0、Java EE 7、JDK 8、WildFly server 8.1.0、JBoss RESTEasy (resteasy-jaxrs-3.0.8)、JBoss 2.2.22、JBoss EJB 3。

私は(比較的)Web開発に慣れていないので、基本的な概念や技術の多くを理解し始めたばかりです。ユーザーとロールを含む許可システムをWebアプリケーションに構築しようとしていますが、RESTful Webサービスで@ RolesAllowed注釈が機能するように思えません。私はすでに数日間この問題に取り組んでいます。

UserResource.JavaというRESTfulリソース(Java Enterprise/Session Bean?)があり、ここにメソッドcreateがありますアプリケーションの新しいユーザーを作成します。

import Java.net.URI;
import Java.security.Principal;
import Java.util.List;
import javax.annotation.security.PermitAll;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ws.rs.*;
import javax.ws.rs.core.*;
import org.jboss.ejb3.annotation.SecurityDomain;

@Stateless
@SecurityDomain("other")
@Path("/user")
public class UserResource {
    @EJB(name = "UserServiceImp")
    UserService userService;

    @Context
    private UriInfo uriInfo;

    @RolesAllowed({"admin"})
    @Path("create")
    @POST
    public Response create(CreateRequest request) {        
        try {
            System.out.println("Start of create method");
            User user = userService.createUser(request);
            return getCreateResponse(user);
        }
        catch (Exception e){
            return Response.status(401).entity("Failed to create user").build();
        }
    }
}

このcreateメソッドは、@ PermitAllアノテーションを使用すると機能しますが、@ RolesAllowedアノテーションを使用するとエラーで失敗します。

このバックボーンビューCreateUserViewを使用して、アプリケーションの新しいユーザーを作成するためのフォーム(HTML)をエンドユーザー(管理者権限を持つ)に提供します。送信ボタンをクリックすると、JSONデータがURL「rest/user/create」に送信され、新しいユーザーが作成されます。 userResource.Javacreateメソッドが実行される前に、mySecurityInterceptor.Javajavax.ws.rs.container.ContainerRequestFilterを実装)は、ユーザーに必要な権限があるかどうかを確認します。私はこれを徹底的にデバッグしましたが、Security Interceptorは正常に機能しています。そのため、Security Interceptorが明確なアクセスを許可した後、UserResource.Javaで何かがおかしくなります。 (補足として、これが重要かどうかはわかりませんが、セキュリティインターセプターは RESTEasyセキュリティに関するこのブログ投稿 に基づいていると思います。私は別の人とアプリケーションに取り組んでいたので、彼は最初にそれを実装しました、だからわかりません。しかし、ほとんど同じように見えます。とにかく、その男は数週間前に別のプロジェクトに移りました。)

私が取得しているエラー(サーバーからの出力)は次のとおりです。

16:45:25,775 ERROR [org.jboss.as.ejb3.invocation] (default task-60) JBAS014134: EJB Invocation failed on component UserResource for method public javax.ws.rs.core.Response org.profit.pgb.rest.resource.UserResource.create(org.profit.pgb.rest.api.CreateRequest): javax.ejb.EJBAccessException: JBAS014502: Invocation on method: public javax.ws.rs.core.Response org.profit.pgb.rest.resource.UserResource.create(org.profit.pgb.rest.api.CreateRequest) of bean: UserResource is not allowed
    at org.jboss.as.ejb3.security.AuthorizationInterceptor.processInvocation(AuthorizationInterceptor.Java:135) [wildfly-ejb3-8.1.0.Final.jar:8.1.0.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.Java:309)
    at org.jboss.as.ejb3.security.SecurityContextInterceptor.processInvocation(SecurityContextInterceptor.Java:95) [wildfly-ejb3-8.1.0.Final.jar:8.1.0.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.Java:309)
    at org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.Java:64) [wildfly-ejb3-8.1.0.Final.jar:8.1.0.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.Java:309)
    at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.Java:59) [wildfly-ejb3-8.1.0.Final.jar:8.1.0.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.Java:309)
    at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.Java:50)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.Java:309)
    at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.Java:55) [wildfly-ejb3-8.1.0.Final.jar:8.1.0.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.Java:309)
    at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.Java:64)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.Java:309)
    at org.jboss.invocation.InterceptorContext.run(InterceptorContext.Java:326)
    at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.Java:448)
    at org.jboss.invocation.AccessCheckingInterceptor.processInvocation(AccessCheckingInterceptor.Java:61)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.Java:309)
    at org.jboss.invocation.InterceptorContext.run(InterceptorContext.Java:326)
    at org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation(PrivilegedWithCombinerInterceptor.Java:80)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.Java:309)
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.Java:61)
    at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.Java:185)
    at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.Java:182)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.Java:309)
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.Java:61)
    at org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.Java:73)
    at org.profit.pgb.rest.resource.UserResource$$$view45.create(Unknown Source) [classes:]
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.8.0_11]
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62) [rt.jar:1.8.0_11]
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43) [rt.jar:1.8.0_11]
    at Java.lang.reflect.Method.invoke(Method.Java:483) [rt.jar:1.8.0_11]
    at org.jboss.weld.util.reflection.Reflections.invokeAndUnwrap(Reflections.Java:401) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23]
    at org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler.invoke(EnterpriseBeanProxyMethodHandler.Java:99) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23]
    at org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance.invoke(EnterpriseTargetBeanInstance.Java:56) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23]
    at org.jboss.weld.bean.proxy.InjectionPointPropagatingEnterpriseTargetBeanInstance.invoke(InjectionPointPropagatingEnterpriseTargetBeanInstance.Java:65) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23]
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.Java:100) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23]
    at org.profit.pgb.rest.resource.UserResource$Proxy$_$$_Weld$EnterpriseProxy$.create(Unknown Source) [classes:]
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.8.0_11]
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62) [rt.jar:1.8.0_11]
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43) [rt.jar:1.8.0_11]
    at Java.lang.reflect.Method.invoke(Method.Java:483) [rt.jar:1.8.0_11]
    at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.Java:137) [resteasy-jaxrs-3.0.8.Final.jar:]
    at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.Java:296) [resteasy-jaxrs-3.0.8.Final.jar:]
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.Java:250) [resteasy-jaxrs-3.0.8.Final.jar:]
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.Java:237) [resteasy-jaxrs-3.0.8.Final.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.Java:356) [resteasy-jaxrs-3.0.8.Final.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.Java:179) [resteasy-jaxrs-3.0.8.Final.jar:]
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.Java:220) [resteasy-jaxrs-3.0.8.Final.jar:]
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.Java:56) [resteasy-jaxrs-3.0.8.Final.jar:]
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.Java:51) [resteasy-jaxrs-3.0.8.Final.jar:]
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.Java:85) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.Java:61) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.Java:36) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.Java:78)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.Java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.Java:113) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.Java:56) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.Java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.Java:51) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.Java:45) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.Java:61) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.Java:56) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.Java:58) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.Java:70) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.Java:76) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.Java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.Java:61)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.Java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.Java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.Java:240) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.Java:227) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.Java:73) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.Java:146) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.Connectors.executeRootHandler(Connectors.Java:177) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.Java:727) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142) [rt.jar:1.8.0_11]
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617) [rt.jar:1.8.0_11]
    at Java.lang.Thread.run(Thread.Java:745) [rt.jar:1.8.0_11]

16:45:25,957 ERROR [io.undertow.request] (default task-60) UT005023: Exception handling request to /pgb/rest/user/create: org.jboss.resteasy.spi.UnhandledException: javax.ejb.EJBAccessException: JBAS014502: Invocation on method: public javax.ws.rs.core.Response org.profit.pgb.rest.resource.UserResource.create(org.profit.pgb.rest.api.CreateRequest) of bean: UserResource is not allowed
    at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.Java:76) [resteasy-jaxrs-3.0.8.Final.jar:]
    at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.Java:212) [resteasy-jaxrs-3.0.8.Final.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.Java:149) [resteasy-jaxrs-3.0.8.Final.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.Java:372) [resteasy-jaxrs-3.0.8.Final.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.Java:179) [resteasy-jaxrs-3.0.8.Final.jar:]
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.Java:220) [resteasy-jaxrs-3.0.8.Final.jar:]
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.Java:56) [resteasy-jaxrs-3.0.8.Final.jar:]
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.Java:51) [resteasy-jaxrs-3.0.8.Final.jar:]
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.Java:85) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.Java:61) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.Java:36) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.Java:78)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.Java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.Java:113) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.Java:56) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.Java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.Java:51) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.Java:45) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.Java:61) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.Java:56) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.Java:58) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.Java:70) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.Java:76) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.Java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.Java:61)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.Java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.Java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.Java:240) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.Java:227) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.Java:73) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.Java:146) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.Connectors.executeRootHandler(Connectors.Java:177) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.Java:727) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142) [rt.jar:1.8.0_11]
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617) [rt.jar:1.8.0_11]
    at Java.lang.Thread.run(Thread.Java:745) [rt.jar:1.8.0_11]
Caused by: javax.ejb.EJBAccessException: JBAS014502: Invocation on method: public javax.ws.rs.core.Response org.profit.pgb.rest.resource.UserResource.create(org.profit.pgb.rest.api.CreateRequest) of bean: UserResource is not allowed
    at org.jboss.as.ejb3.security.AuthorizationInterceptor.processInvocation(AuthorizationInterceptor.Java:135) [wildfly-ejb3-8.1.0.Final.jar:8.1.0.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.Java:309)
    at org.jboss.as.ejb3.security.SecurityContextInterceptor.processInvocation(SecurityContextInterceptor.Java:95) [wildfly-ejb3-8.1.0.Final.jar:8.1.0.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.Java:309)
    at org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.Java:64) [wildfly-ejb3-8.1.0.Final.jar:8.1.0.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.Java:309)
    at ... etc. (not fully shown due to SO's character limit on questions..)

他の人が同様の質問をするのを見たことがあります。今日まで答えられない人もいます(例: jax-rs service RolesAllowed Annotation throwing exception )。ソリューションを正しく適用しないでください(例: RESTEasyのJAX-RS @RolesAllowedのサポート )。

私はこれを見つけました: https://developer.jboss.org/thread/177728?start=0&tstart= (titled: "@ RolesAllowed、@ DenyAllには組織の存在が必要です.jboss.ejb3.annotation.SecurityDomain? ")、解決策を試しましたが、プロジェクトで動作させることができません。解決策が私の状況に当てはまらないのか、それとも間違っているだけなのかわかりません。

私はこれを見つけました: https://developer.jboss.org/message/720815 (titled: "これはorg.jboss.ejb3.annotation.SecurityDomainを処理するための欠陥です? ")、しかし、私のjboss-ejb-client.propertiesがどこにあるべきか理解できません。彼らは自分のプロジェクトを私とは全く異なるように設定したと思います。だからそれで運がない。

EJB3セキュリティに関するガイド が見つかりました。そこで提案されているように、standalone.xml-ファイルに次のコードを提供しました。

<security-domain name="other" cache-type="default">
    <authentication>
        <login-module code="Remoting" flag="optional">
            <module-option name="password-stacking" value="useFirstPass"/>
        </login-module>
        <login-module code="RealmDirect" flag="required">
            <module-option name="password-stacking" value="useFirstPass"/>
        </login-module>
    </authentication>
</security-domain>

しかし、それはまったく何も解決しませんでした。それが何かをしたかどうかはわかりません。

最後に、これを見つけましたSO質問: RESTEasy JAX-RS @RolesAllowedのサポート (これは RESTEasyドキュメント を参照しています。)私はまた、この質問を私にとってはうまくいかない解決策を含むものとしていくつかの段落で言及しましたが、エラーを別のエラーに変更しました。そこに示唆されているように、<context-param>-myweb.xml-fileへのブロック:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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_2_5.xsd">
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>PGB</web-resource-name>
            <url-pattern>/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>

        <user-data-constraint>
            <!-- use of SSL is required when CONFIDENTIAL is specified -->
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>

    <context-param>
      <param-name>resteasy.role.based.security</param-name>
      <param-value>true</param-value>
   </context-param>
</web-app>

新しいユーザーを作成しようとすると、次のエラーが発生します(SO質問)の文字制限のため、ここに完全には投稿されません):

16:58:45,992 WARN  [org.jboss.resteasy.core.ExceptionHandler] (default task-61) failed to execute: javax.ws.rs.ForbiddenException: HTTP 403 Forbidden
    at org.jboss.resteasy.plugins.interceptors.RoleBasedSecurityFilter.filter(RoleBasedSecurityFilter.Java:45) [resteasy-jaxrs-3.0.8.Final.jar:]
    at ... etc.

このエラーもあまり役に立ちません。実際、前のエラーを検索するときよりも、そのエラーを検索するときのほうが、さらに少ない情報しか見つかりません。だから、それが正しい方向への一歩かどうかはわかりません。サーバーから返された方が良いですか?ステータス500(内部サーバーエラー)またはステータス403(禁止)?また、その「ソリューション」を適用した後、注釈を@PermitAllに変更すると、新しいユーザーの作成は以前と同じように機能するため、状況が実際に悪化することはありませんでした。

ただし、 RoleBasedSecurityFilterのソースコード を見つけることができます。これは、ForbiddenExceptionをスローすることを示しています。特定のisUserInRoleメソッドはtrueを返さなければならないことを示していますが、アプリケーションではそれを行いません。 trueを返すことができません。 RESTEasyのRoleBasedSecurityFilter.Javaを無効にすることは可能ですか?

また、次のSO質問: @ RolesAllowedはJerseyでは解決できません が見つかりました。これはAbhijit Sarkarによって回答され、彼は IBMの記事 。私の問題の解決策はそこにあるかもしれませんが、まだ見つけていません..とにかく、そこにsecurity-roleブロックを追加することをお勧めしますmyweb.xml-fileまたはmy@ DeclareRolesアノテーションをmyUserResource.Javaファイルは問題を解決するはずですが、HTTP 403 Forbidden警告は、それを行った後も残っています。

私のsecurity-roleブロック(web.xml内)は次のようになります。

<security-role id="role_admin">
    <description>This is role 1 (admin)</description>
    <role-name>admin</role-name>
</security-role>

そして、次のsecurity-constraintブロック(web.xml内)を追加しました:(auth-constraintに注意してください)

<security-constraint>
    <web-resource-collection>
        <web-resource-name>PGB</web-resource-name>
        <url-pattern>/rest/user/create</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint id="AuthConstraint_createUser">
        <description> Only admin can create a new user</description>
        <role-name>admin</role-name>
    </auth-constraint>
    <user-data-constraint>
        <!-- use of SSL is required when CONFIDENTIAL is specified -->
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

私の問題は、デプロイメント記述子(web.xml)またはサーバー構成(WildFlyのstandalone-full.xml)。

login-config要素( FORM認証 )をweb.xmlファイルに追加しました。ログインHTMLページを 必要な形式 に合うように変更しました。 Java EEアプリをGlassFishからWildFlyに移行する ]のこの記事の手順のいくつかに従いましたが、常に間違っているため、何か間違ったことをしたと思います。有効なユーザー資格情報でログインしようとすると、ログインエラーページが表示されます。

WildFly構成に追加したsecurity-domain要素を参照してください。

<security-domain name="app" cache-type="default">
    <authentication>
        <login-module code="Database" flag="required">
            <module-option name="dsJndiName" value="Java:jboss/datasources/mySQL_pool_rel"/>
            <module-option name="principalsQuery" value="select hashed_password from user where email_address=?"/>
            <module-option name="rolesQuery" value="select role_name, 'Roles' from role r inner join user u on r.role_type = u.role_type where u.email_address = ?"/>
            <module-option name="hashAlgorithm" value="SHA-256"/>
            <module-option name="hashEncoding" value="BASE64"/>
            <module-option name="unauthenticatedIdentity" value="guest"/>
        </login-module>
        <login-module code="RoleMapping" flag="required">
             <module-option name="rolesProperties" value="file:${jboss.server.config.dir}/app.properties"/>
             <module-option name="replaceRole" value="false"/>
        </login-module>
    </authentication>
</security-domain>

そこに定義されているrolesQueryに何か問題があると思いますが、何がわからないのでしょうか。

Webアプリケーションにロールベースのセキュリティを実装する方法を知りたいです。したがって、機能する限り、ロールベースのセキュリティに対する他のアプローチも受け入れます。提案を歓迎します。

developer.jboss.orgに関する私の質問 も配置しましたが、まだ応答がありませんでした。

この問題に対する回答として、私の問題に対する回避策を1つ提供しましたが、実際の解決策ではありません(その回答で説明されています)。私はまだこれを正しい方法で行うことに興味があります。

16
PJvG

ちょうど同じ問題がありました。

_@Stateless_アノテーションです。はクラスをEJBとしてマークし、コンテナはEJBセキュリティを実施しようとします。

私は、フィルターと独自のSecurityContextを作成することでこれを発見しましたが、私のSecurityContextが参照されることはありませんでした。

_@Stateless_を削除すると、SecurityContextgetUserPrincipal()が呼び出されます。

10
tptptp

エラー「403」に基づいて、ロールクエリに何か問題があるように思われます。たぶん、ログインモジュールはユーザーに「admin」ロールを割り当てません。できることの1つは、カスタム認証メカニズムを実装することです http://undertow.io/undertow-docs/undertow-docs-1.3.0/#authentication-mechanisms (例: https ://github.com/dstraub/spnego-wildfly )、ログインモジュールがユーザーに割り当てるロールを確認できるように変更します。カスタム認証メカニズムの実装には時間がかかりますが、ワイルドフライでのセキュリティの仕組みをよりよく理解するのに役立ちます。

Rolesアノテーションが機能するために私がしなければならなかった他のことは、standalone.xmlを変更し、デフォルトのセキュリティドメインとして設定することです。

また、これらの行を追加することは、私にとって正しい方向への一歩です。これらの行注釈がないと、@ RolesAllowedは機能しません。

<context-param>
    <param-name>resteasy.role.based.security</param-name>
    <param-value>true</param-value>
</context-param>

また、web.xmlのみを使用してセキュリティを実装することをお勧めします。その後、@ RolesAllowedを追加してみてください。

4
Zhenya

私の問題の解決策を見つけました。ただし、@ RolesAllowed注釈を使用しないため、これはworkaroundほど問題の解決策ではありません。

展開記述子とサーバー構成を正確に定義する方法を理解できなかったため、@ RolesAllowed注釈を使用しなかった場合、問題ははるかに簡単に解決されると考えました。

他の人は本当にlogin-config要素のweb.xmlファイルにあり、他の認証手段を使用していません。このアプローチはその要素を使用せず、代わりに RESTful Web Services (これは、デプロイメント記述子またはサーバー構成を変更する必要がないことを意味します)。

新しいEnterprise Java Bean(EJB)と呼ばれるSecurityFilterという名前の特定の機能に必要なロールがあるかどうかを確認します。次のように実装されます。

import Java.util.Arrays;
import Java.util.HashSet;
import Java.util.Set;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ws.rs.core.HttpHeaders;
import org.profit.pgb.rest.user.UserService;

@Stateless
public class SecurityFilter
{
    @EJB(name = "UserServiceImp")
    UserService userService;

    public boolean isUserAllowed (String[] rolesArray, HttpHeaders hHeaders)
    {
        Set<String> rolesSet = new HashSet<>(Arrays.asList(rolesArray));

        String uuid = hHeaders.getRequestHeader("user").get(0);
        String token = hHeaders.getRequestHeader("token").get(0);

        if (userService.isAuthorizationTokenValid(uuid, token))
        {
           if (userService.isUserAllowed(uuid, rolesSet))
           {
               return true; // user allowed access
           }
        }   
        return false; // 401
    }
}

メソッドisUserAllowedは、UserResource.Javacreateメソッドで呼び出されます。このcreateメソッドの古い実装は、上記の質問で見ることができます。新しい実装は次のとおりです。

@PermitAll
@Path("create")
@POST
public Response create(CreateRequest request, @Context HttpHeaders hHeaders) {  
    if (securityFilter.isUserAllowed(new String[]{"admin"}, hHeaders))
    {
        try {
            System.out.println("Start of create method");
            User user = userService.createUser(request);
            return getCreateResponse(user);
        }
        catch (Exception e){
            return Response.status(401).entity("Failed to create user").build();
        }
    }
    else
        return Response.status(401).entity("Access denied! User does not have permission to create user").build();
}

ご覧のとおり、このアプローチではif-elseステートメントが@ RolesAllowed注釈を置き換え、セキュリティフィルターの実装は少し異なります。

また、このアプローチは HttpHeaders を使用してリクエストヘッダー(ユーザーIDとトークンが格納されている)を取得します。 受け入れられた回答 SO質問 " REST Webサービスサーバー側で「Accept」ヘッダーを受信する方法 "を見つけるのに役立ちました リクエストヘッダーの取得方法

さらに、このアプローチは、Backbone.js-およびBootstrapベースのWebページ(つまり、HTMLおよびJavaScriptファイル)。

1
PJvG

私の答え here にあなたの投稿を見ました。私はJBoss独自のセキュリティにあまり詳しくありません。コードに埋め込むこともお勧めしませんが、それは私の問題ではないと思います。あなたのコードから、security-roleまたは@DeclareRolesが表示されません。私の回答では、注釈ベースのセキュリティが機能するにはどちらかが必要であることが明確に述べられています。簡潔にするためにそれを除外しましたか、または見落としましたか?後者の場合、@DeclareRolesUserResourceクラスに追加し、それが役立つかどうかを確認します。

0
Abhijit Sarkar