Java EE 7 EJB Безопасность не работает

У меня есть приложение EAR Java EE, работающее на wildfly 8.2, я пытаюсь реализовать декларативную безопасность Java EE для защиты доступа к методам EJB. Таким образом, я добавил в standalone.xml

<security-domain name="MyDomain" cache-type="default">
    <authentication>
        <login-module code="Database" flag="required">
            <module-option name="dsJndiName" value="java:jboss/datasources/MyDatasource"/>
            <module-option name="principalsQuery" value="select password from user where username = ?"/>
            <module-option name="rolesQuery" value="select DISTINCT r.name, 'Roles' from role r left join user_roles ur on ur.role_id=r.id left join user u on u.id=ur.user_id where u.username= ? and u.status=1 and r.active=1"/>
            <module-option name="hashAlgorithm" value="SHA-256"/>
            <module-option name="hashEncoding" value="base64"/>
            <module-option name="unauthenticatedIdentity" value="guest"/>
        </login-module>
    </authentication>
</security-domain>

В jboss-web.xml у меня есть

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web xmlns="http://www.jboss.com/xml/ns/javaee" 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-web_5_1.xsd">
  <security-domain>MyDomain</security-domain>
  <disable-audit>true</disable-audit>
  <context-root/>
</jboss-web>

и в web.xml у меня есть

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>MyDomain</realm-name>
    <form-login-config>
        <form-login-page>/login.xhtml</form-login-page>
        <form-error-page>/login.xhtml?failed=true</form-error-page>
    </form-login-config>
</login-config>

В одном из ManagedBeans у меня есть

@Named("levelController")
@DeclareRoles({"Create-Level", "View-Level", "Edit-Level", "Delete-Level"})
public class LevelController implements Serializable {

   @DenyAll
   public String create() {
      //bla bla bla
   }

}

Я получил доступ к levelController.create() из jsf и смог успешно создать уровень без входа в систему.

Это просто означает, что аннотация безопасности НЕ работает / возможно, что-то я не правильно делаю. Может кто-нибудь, пожалуйста, помогите мне определить, в чем проблема

1 ответ

Решение

@DenyAll и @DeclareRoles (а также @RolesAllowed) работают только с EJB-компонентами (сеансами), а не с только-названными.

Попробуйте добавить @Stateless, чтобы сделать ваш компонент сессионным, или @Stateful в сочетании с областью действия (например, @RequestScoped).

Другие вопросы по тегам