it-swarm.com.ru

Как заставить аннотацию @RolesAllowed работать для моего веб-приложения?

Я делаю веб-приложение, используя Backbone.js, Bootstrap, NetBeans IDE 8.0, Java EE 7, JDK 8, WildFly сервер 8.1.0, JBoss RESTEasy (resteasy-jaxrs-3.0.8), JBoss 2.2.22 , JBoss EJB 3.

Я (относительно) новичок в веб-разработке, и поэтому я только начал осваивать множество базовых концепций и технологий. Я пытаюсь встроить систему разрешений с пользователями и ролями в веб-приложение, но я не могу заставить @RolesAllowed annotation работать в моей RESTful Web-службе. Я уже работаю над этой проблемой в течение нескольких дней.

У меня есть ресурс RESTful (Java Enterprise/Session Bean?) С именем UserResource.Java, здесь у меня есть метод 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.

У меня есть это представление Backbone CreateUserView, которое предоставляет форму (в HTML) конечному пользователю (с правами администратора) для создания новых пользователей для приложения. При нажатии кнопки «Отправить» данные JSON отправляются на URL «rest/user/create» для создания нового пользователя. Перед выполнением метода create в UserResource.Java мой SecurityInterceptor.Java _ (который реализует javax.ws.rs.container.ContainerRequestFilter) проверяет, есть ли у пользователя необходимые разрешения. Я тщательно отладил, и перехватчик безопасности работает как надо. Таким образом, после того как 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 выбросив исключение ) и другие, у которых есть решения, которые либо не работают для меня, либо, возможно, я не применяю решение правильно (например, RESTEasy поддержка JAX-RS @RolesAllowed ).

Я нашел это: https://developer.jboss.org/thread/177728?start=0&tstart=0 (под названием: "@RolesAllowed, @DenyAll требует наличия org.jboss.ejb3.annotation. SecurityDomain? "), In пробовал решение, но я не могу заставить его работать для моего проекта. Не уверен, что решение не подходит для моей ситуации или я просто делаю это неправильно.

Я нашел это: https://developer.jboss.org/message/720815 (озаглавленный: "это дефект для обработки 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>- блок в мой web.xml- файл:

<?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, но в моем приложении этого не происходит. Я не могу заставить его вернуть истину. Это заставляет меня задуматься, Можно ли отключить RoleBasedSecurityFilter.Java из RESTEasy? .

Я также нашел следующий SO вопрос: @RolesAllowed не может быть решен с помощью Джерси , на который отвечает Абхиджит Саркар, и он ссылается на статью IBM . Возможно, решение моей проблемы лежит там, но я еще не нашел его. В любом случае, там предлагается либо добавить блок security-role к моему web.xml -file или добавление аннотации @DeclareRoles к моему файлу UserResource.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-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>

login-configаутентификацией FORM ) в свой файл web.xml. Изменил мою страницу входа в систему HTML, чтобы соответствовать требуемый формат . Я выполнил некоторые действия, описанные в этой статье, по поводу переноса приложения Java EE из GlassFish в WildFly , но, по-моему, я все-таки сделал что-то не так, потому что всегда попадаю на страницу ошибки при попытке войти с действительными учетными данными пользователя ,.

Смотрите здесь элемент security-domain, который я добавил в свою конфигурацию WildFly:.

<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>

Я хотел бы знать, как реализовать безопасность на основе ролей для моего веб-приложения. Поэтому я также принимаю другие подходы к безопасности на основе ролей, если она работает. Предложения приветствуются.

Я также разместил мой вопрос на developer.jboss.org , но я также не получил там ответа.

В качестве ответа на этот вопрос я предоставил одно решение этой проблемы, но это не реальное решение (как объяснено в этом ответе). Я все еще заинтересован в том, чтобы сделать это правильно.

I provided one workaround solution to my problem as an answer to this question, but it is not a real solution (as explained in that answer). I am still interested in doing this the right way.

15
PJvG

Просто была такая же проблема. 

Это аннотация @Stateless. Помечает ваш класс как EJB, а контейнер пытается обеспечить безопасность EJB.

Я обнаружил это, написав фильтры и свой собственный SecurityContext, только чтобы обнаружить, что на мою SecurityContext никогда не ссылались. 

Удаление @Stateless привело к вызову getUserPrincipal() для SecurityContext.

8
tptptp

Исходя из ошибки «403», мне кажется, что с вашим запросом роли что-то не так. Возможно, ваш модуль входа в систему не назначает роль «admin» вашему пользователю. Одна вещь, которую вы могли бы сделать, это реализовать собственный механизм аутентификации http://undertow.io/undertow-docs/undertow-docs-1.3.0/#authentication-mechanisms (пример: https: // github. com/dstraub/spnego-wildfly ) и измените его так, чтобы вы могли проверить, какие роли назначает ваш модуль входа в систему для вашего пользователя. Реализация специального механизма аутентификации займет у вас некоторое время, но поможет вам лучше понять, как работает защита в wildfly.

Еще одна вещь, которую я должен был сделать, чтобы моя аннотация ролей работала, это изменить standalone.xml и установить ваш домен безопасности в качестве домена по умолчанию.

Кроме того, добавление этих строк является шагом в правильном направлении, как для меня. Без этих строк аннотации @RolesAllowed не работают для меня.

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

Кроме того, я бы посоветовал реализовать безопасность, используя только web.xml, и только после этого попробуйте добавить @RolesAllowed. 

4
Ievgen

Я нашел одно решение моей проблемы. Однако это не столько решение проблемы, сколько workaround, поскольку он не использует аннотацию @RolesAllowed.

Поскольку я не мог понять, как точно определить мои дескрипторы развертывания и конфигурацию сервера, я решил, что проблема будет решена гораздо проще, если я просто не буду использовать аннотацию @RolesAllowed.

Даже если другие люди действительно хотят использовать элемент login-config в своем файле web.xml и не используют никаких других средств аутентификации, этот подход не использует этот элемент, но вместо этого выполняет аутентификацию исключительно через RESTful Web Службы (что означает, что ничего не нужно менять в дескрипторах развертывания или конфигурации сервера).

Я создал новый 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 вызывается в методе createUserResource.Java. Старую реализацию этого метода 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 для получения заголовков запроса (в которых хранятся идентификатор пользователя и токен). Принятый ответ на SO вопрос " как получить заголовок" Принять "на стороне сервера веб-службы REST " помог мне найти как получить заголовки запроса .

Кроме того, этот подход работает без каких-либо изменений в моих веб-страницах на основе Backbone.js- и Bootstrap (то есть моих файлов HTML и JavaScript).

1
PJvG

Я видел ваш пост в моем ответе здесь . Я не очень хорошо знаком с частной защитой JBoss, и я не рекомендую встраивать ее в код, но, думаю, это не моя проблема. Из вашего кода я не вижу security-role или @DeclareRoles настоящего; в моем ответе четко указано, что вам нужен любой из них для обеспечения безопасности на основе аннотаций. Вы исключили это для краткости или упустили? В последнем случае добавьте @DeclareRoles в класс UserResource и посмотрите, поможет ли это.

0
Abhijit Sarkar