В настоящее время я изучаю, как 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 ...
Любой совет?
Заранее спасибо :)