Настройка безопасности в веб-сервисе JAVA EE6 - PullRequest
4 голосов
/ 08 декабря 2011

В настоящее время я изучаю, как Java EE6 Security может защитить наши приложения с помощью GlassFish. Я знаю, как создавать сферы, роли и пользователей. Мне удалось получить хороший базовый логин с сервлетом. «Нормальным» пользователям не разрешалось видеть страницу администратора, в то время как пользователь администратора, так что тест прошел хорошо.

Теперь, однако, я хочу немного углубиться в это.

Идея состоит в том, что я размещаю веб-сервис, используя контейнер EJB. Этот веб-сервис ничего не знает о своих вызывающих, поэтому я решил, что вызывающий должен отправить учетные данные (имя пользователя и пароль) вместе с вызовом. Затем веб-служба может аутентифицировать пользователя и на основании этого разрешить или запретить доступ к методам.

Дело в том, что я понятия не имею, как проверить 2 строки (имя пользователя и пароль) и настроить роль для вызывающих абонентов в веб-службе.

Я знаю, что этот API должен помочь мне: http://docs.oracle.com/javaee/1.4/api/javax/ejb/EJBContext.html

Но это не дает мне четкого понимания, как это сделать. Все, что он говорит мне, это то, что я могу проверить определенные свойства, когда пользователь уже в роли, но поскольку это веб-сервис, роли еще нет ... Сначала я должен его создать, но как?

Кроме того, я знаю, что GlassFish поддерживает вход через LDAP, что является конечной целью, над которой я работаю. Возможно, есть идеи, как это сделать правильно? Как лучше всего подойти ко всему этому?

Заранее спасибо,

Rens

=============================================== ==============================

UPDATE / EDIT:

Хорошо, так как я мог только комментировать и не мог отвечать, я решил, что я просто отредактирую свой оригинальный пост. Вот и мы:

Идея заключается в том, что мне нужно исследовать EE6 Security для веб-сервисов Glassfish. Теперь ... Я много читал о JAAS (Служба авторизации для аутентификации Java). Он работает с аннотациями в bean-компоненте веб-сервиса следующим образом:

@RolesAllowed("ADMIN")
public String doAdminStuff(){
   // do something
}

Я попробовал кое-что с сервлетом, и это сработало очень здорово! У меня есть базовая аутентификация, которая позволила пользователю войти в систему перед доступом к бину веб-сервиса. Сервлет web.xml позаботился о настройке, описывающей, какую область проверять и какие пользователи были там и т. Д.

Теперь я должен протестировать его без сервлета, потому что идея заключается в том, что веб-сервис может работать, не зная своих клиентов. Таким образом, клиент должен предоставить имя пользователя и пароль вместе со своим вызовом. Для входа в систему я использовал перехватчик, а затем проверял, авторизован ли пользователь для доступа к методу с помощью аннотации @RolesALlowed.

Это код: bean-компонент веб-службы:

@LocalBean
    @WebService
    @Stateless
    public class EE6SecurityBean implements EE6SecurityBeanInterface {

    @Interceptors(UserValidationInterceptor.class)
    @RolesAllowed("ADMIN")
    public String doAdminStuff(String user, String password){
        return "it works";
    }

    }

Тогда перехватчик:

@Interceptor
    public class UserValidationInterceptor {

private ProgrammaticLoginInterface programmaticLogin = new ProgrammaticLogin();
@AroundInvoke
public Object intercept(InvocationContext ctx) throws Exception {

    // for all parameters
    List<String> list = new ArrayList<String>();
    for (Object p : ctx.getParameters()) {
        list.add(p.toString());
    }
    String username = list.get(0).toString();
    String password = list.get(1).toString();

    boolean loginSuccessful = programmaticLogin.login(
            username, password, "Developingjava", true);  
    if (loginSuccessful) {

    return ctx.proceed();
    }else{
        throw new userValidationException();
    }

}
}

Теперь это работает нормально, если я комментирую @RolesAllowed ("ADMIN"), за исключением того, что каждый пользователь, которого я настроил в области 'Developingjava', может использовать этот метод. Но если я использую @RolesAllowed ("ADMIN"), я получаю следующую ошибку:

ИНФОРМАЦИЯ: Поставщик политики JACC: проверка с ошибкой разрешения, контекст (EE6SecurityEAR / EE6SecurityEJB_jar) - разрешение ((javax.security.jacc.EJBMethodPermission EE6SecurityBean testWaarde, ServiceEndpoint, java.lanSt.gring.gring.gring.gring.gring.dll) .ring *

Я настроил свой sun-ejb-jar.xml следующим образом (сервлету требовалась конфигурация xml, но я очень сомневаюсь, что бин даже использует его ..):

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 EJB 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-ejb-jar_3_0-0.dtd">
<sun-ejb-jar>


    <security-role-mapping>
        <role-name>ADMIN</role-name>
        <group-name>Admin</group-name>
        <principal-name>Admin</principal-name>
    </security-role-mapping>


        <enterprise-beans>
        <unique-id>1</unique-id>
        <ejb>
            <ejb-name>EE6SecurityBean</ejb-name>
            <jndi-name></jndi-name>

            <pass-by-reference>false</pass-by-reference>
            <ior-security-config>
                <transport-config>
                    <integrity>supported</integrity>
                    <confidentiality>supported</confidentiality>
                    <establish-trust-in-target>supported</establish-trust-in-target>
                    <establish-trust-in-client>supported</establish-trust-in-client>
                </transport-config>
                <as-context>
                    <auth-method>username_password</auth-method>
                    <realm>Developingjava</realm>
                    <required>true</required>
                </as-context>
                <sas-context>
                    <caller-propagation>supported</caller-propagation>
                </sas-context>
            </ior-security-config>
            <is-read-only-bean>false</is-read-only-bean>
            <refresh-period-in-seconds>-1</refresh-period-in-seconds>
            <gen-classes/>

        </ejb>
    </enterprise-beans>
</sun-ejb-jar>

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

Любой совет?

Заранее спасибо :)

1 Ответ

0 голосов
/ 08 декабря 2011

Лучший способ, который я бы предложил, это использовать двухсторонний SSL. вот метод о том, как настроить двухсторонний ssl в glassfish . с 2-way ssl клиент (который вызывает вашу службу) должен хранить jks (keystore) и пароль. это идентифицирует клиента с сервером. таким образом, аутентификация выполняется сервером, и вам не нужно ничего кодировать ...

эта техника работает только для идентификации 1 типа клиента (то есть вы не можете иметь никаких различий между пользователем и администратором).

Если вы пытаетесь идентифицировать абонентов (клиентов) отдельно, тогда вы можете использовать wsse, заголовок безопасности, здесь вы можете предоставить каждому типу пользователя идентификатор пользователя и пароль, эту информацию необходимо передать пользователю в заголовке мыла с каждым запросом.

Таким образом, вы можете идентифицировать и аутентифицировать разных пользователей.

...