Окружающая среда:
- JAVA
- Glassfish
- REST-сервисы на разных машинах.
- HTML5-клиент с AJAX и JQuery
- Джерси
Это то, что я реализовал до сих пор:
HTML5-клиент ###
$('#btnSignIn').click(function () {
var username = $("#username").val();
var password = $("#password").val();
function make_base_auth(user, password) {
var tok = user + ':' + password;
var final = "Basic " + $.base64.encode(tok);
console.log("FINAL---->" + final);
alert("FINAL---->" + final);
return final;
}
$.ajax({
type: "GET",
contentType: "application/json",
url: "http://localhost:8080/SesameService/webresources/users/secured/login",
crossDomain: true,
dataType: "text",
async: false,
data: {},
beforeSend: function (xhr) {
xhr.setRequestHeader('authorization', make_base_auth(username, password));
},
success: function () {
alert('Thanks for your signin in! ');
},
error: function (jqXHR, textStatus, errorThrown) {
console.log(textStatus, errorThrown);
alert(' Error in signIn-process!! ' + textStatus);
}
});
});
SERVER
В разделе "Безопасность" у меня нет диспетчера безопасности, он отключен!
Я настроил BASIC-аутентификацию на Glassfish, и мой web.xml выглядит следующим образом:
<servlet-mapping>
<servlet-name>ServletAdaptor</servlet-name>
<url-pattern>/webresources/*</url-pattern>
</servlet-mapping>
<security-constraint>
<web-resource-collection>
<web-resource-name>REST Protected resources</web-resource-name>
<description/>
<url-pattern>/users/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
<role-name>customer</role-name>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>jdbcRealm</realm-name>
</login-config>
<security-role>
<role-name>admin</role-name>
</security-role>
<security-role>
<role-name>user</role-name>
</security-role>
<security-role>
<description/>
<role-name>customer</role-name>
</security-role>
GlassFish
LOG
FINE: [Web-Security] Setting Policy Context ID: old = null ctxID = SesameService/SesameService
FINE: [Web-Security] hasUserDataPermission perm: ("javax.security.jacc.WebUserDataPermission" "/webresources/users/secured/login" "GET")
FINE: [Web-Security] hasUserDataPermission isGranted: true
FINE: [Web-Security] Policy Context ID was: SesameService/SesameService
FINE: [Web-Security] hasResource isGranted: true
FINE: [Web-Security] hasResource perm: ("javax.security.jacc.WebResourcePermission" "/webresources/users/secured/login" "GET")
Вопрос:
-
Если я шифрую (НЕ кодирую) пароль в клиенте, когда пользователь регистрируется и передает его под SSL/HTTPS, является ли этот безопасный и хороший способ реализовать это?
-
Если я использую REST-сервис без клиента, он всегда открыт, ПОЧЕМУ? Нет BASIC-аутентификации? Я понял что-то не так с этими шаблонами url?
http://localhost:8080/SesameService/webresources/users/secured/login
-
ЕСЛИ я получу эту работу, как проверить это, потому что теперь, если я аутентифицирую один раз, я всегда уполномочен? Возможно ли "выйти из системы" программно внутри REST-сервиса или вообще как реализовать выход из системы?
-
При использовании авторизации в заголовке с обязательным именем пользователя с кодировкой base64: пароль должен ли я также закодировать свое имя пользователя и пароль для БД? Я попробовал это и добавил Encoding (допустимые значения Hex и Base64) в jdbcRealm в Glassfish, и кажется, что пароля достаточно, но что происходит, когда оба закодированы на клиенте?
ОБНОВЛЕНИЕ: Я изменил web.xml и теперь BASIC-аутентификация работает при вызове REST-сервиса прямо в браузере: http://localhost:8080/SesameService/users/secured/login
Изменения:
- Я включил менеджера безопасности в Glassfish
-
Я изменил шаблон url
ServletAdaptor /* ---- > Я снял webresources. Он был создан Netbeans
-
Я изменил URL-адрес для обслуживания:
http://localhost:8080/SesameService/users/secured/login
Теперь я получаю HTTP/1.1 401 Unauthorized при попытке аутентификации с HTML5-клиента.
Заголовки запроса: `
Origin: http://localhost:8383
Host:`localhost:8080`
Connection:keep-alive
Access-Control-Request-Method:GET
Access-Control-Request-Headers:authorization,content-type`
Ответ:
x-powered-by:Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.2.2 Java/Oracle Corporation/1.7)
WWW-Authenticate:Basic realm="jdbcRealm"
Server:GlassFish Server Open Source Edition 3.1.2.2
Pragma:No-cache
Expires:Thu, 01 Jan 1970 02:00:00 EET
Date:Sat, 13 Apr 2013 15:25:06 GMT
Content-Type:text/html
Content-Length:1073
Cache-Control:no-cache
ОБНОВЛЕНИЕ 2
Когда я пытаюсь выполнить аутентификацию с помощью JavaScript + Заголовок авторизации, я получил ошибку 401 и что в журнале:
FINE: [Web-Security] Setting Policy Context ID: old = null ctxID = SesameService/SesameService
FINE: [Web-Security] hasUserDataPermission perm: ("javax.security.jacc.WebUserDataPermission" "/users/secured/login" "OPTIONS")
FINE: [Web-Security] hasUserDataPermission isGranted: true---->!!!!!!!!!!!!!
FINE: [Web-Security] Policy Context ID was: SesameService/SesameService
FINE: [Web-Security] Codesource with Web URL: file:/SesameService/SesameService
FINE: [Web-Security] Checking Web Permission with Principals : null------->!!!!!!!
FINE: [Web-Security] Web Permission = ("javax.security.jacc.WebResourcePermission" "/users/secured/login" "OPTIONS")
FINEST: JACC Policy Provider: PolicyWrapper.implies, context (SesameService/SesameService)- result was(false) permission (("javax.security.jacc.WebResourcePermission" "/users/secured/login" "OPTIONS"))
FINE: [Web-Security] hasResource isGranted: false------->!!!!!!!!!
FINE: [Web-Security] hasResource perm: ("javax.security.jacc.WebResourcePermission" "/users/secured/login" "OPTIONS")
FINEST: JACC Policy Provider: PolicyWrapper.getPermissions(cs), context (null) codesource ((null <no signer certificates>)) permissions: [email protected] (
**** ОБНОВЛЕНИЕ 3 **** Я не могу быть первым и единственным человеком, который пытается аутентифицироваться с использованием BASIC в случае с кросс-доменом. Я сменил фильтры своего креста: response.getHttpHeaders(). putSingle ( "Access-Control-Allow-Headers", "Авторизация" );
Ошибка NO 401, но все еще ошибка в JavaScript. IN Журнал Glassfish:
FINEST: JACC Policy Provider:
getPolicy (SesameService/SesameService) is NOT in service----->!!!!!!!!
FINE: JACC Policy Provider: file arrival check type: granted arrived: false exists: false lastModified: 0 storedTime: 1365968416000 state: deleted SesameService/SesameService
FINE: JACC Policy Provider: file arrival check type: excluded arrived: false exists: false lastModified: 0 storedTime: 0 state: deleted SesameService/SesameService
FINE: TM: getTransaction: tx=null, tm=null
FINE: TM: [email protected]7fe9a8
FINE: TM: resourceTable before: 0
FINE: TM: resourceTable after: 0
Кстати, потому что я никогда не получаю эту работу, делает это так же, как вызов REST-сервиса прямо в своем собственном домене. Итак, открывается первый клиентский запрос, запросы сервера и имя пользователя-пароля, затем запрос клиента и сервер аутентифицируются и отвечают на эту страницу? Я пытаюсь его получить: запрос с заголовком авторизации в нем, ответ от сервера с результатом службы останова и его. Любая идея, как обеспечить REST-услуги? Легче этого? Это невозможно.
ОБНОВЛЕНИЕ 4
Я просто попытался переместить моего HTML5-клиента в веб-проект java, только чистые html-страницы и в том же домене, а BASIC-аутентификация работает на 100%. Поэтому причина кросс-доменная среда.