|
|
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, посоветуйте, как лучше реализовать авторизацию в приложении? есть вебприложение (smartgwt), развернутое на glassfish. в приложении отображаются, редактируются и тп. данные, хранящиеся в бд оракл. используются рест службы. теперь необходимо реализовать авторизацию пользователей. пользователи заводятся в самой базе. в оракле вьюшки, отображающие данные о пользователе - sys.dba_role_privs, dba_users, dba_roles. попробовал использовать jdbcrealm, не получилось, скорее всего изза пароля, всмысле шифрование на гласфише и в оракл разные (это предположение). а так было б хорошо, если указать в web.xml security-constraint для ролей и прописать там - какие можно выполнять запросы get, post .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 11:33:05 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
1. Прочитать мануал соответствующего сервера приложений по конфигурированию реалма в БД 2. Предпринять необходимые действия 3. Если что-то не получилось - выложить сюда максимально полную информацию об ошибке - что делали, что за ошибка, как пытались исправить и т.д.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 11:43:29 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
svenom, создаю пул jdbc/test. теперь создаю реалм testRealm - JAAS Context: jdbcRealm JNDI: jdbc/test User Table: sys.dba_users User Name Column: username Password Column: password Group Table: sys.dba_users_roles Group Name Column: GRANTED_ROLE поля encoding и Digest Algorithm при создании реалма пробовал заполнять разными способами, т.е. Digest Algorithm: none, SHA-256, MD5, для encoding: Hex, Base64. 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"> <servlet> <servlet-name>LogoutServlet</servlet-name> <servlet-class>security.LogoutServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LogoutServlet</servlet-name> <url-pattern>/LogoutServlet</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file> index.jsp </welcome-file> </welcome-file-list> <security-constraint> <web-resource-collection> <web-resource-name>Secure Pages</web-resource-name> <url-pattern>/restricted/*</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>root</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>testRealm</realm-name> </login-config> <security-role> <description/> <role-name>root</role-name> </security-role> </web-app> glassfish-web.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" " http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> <glassfish-web-app error-url=""> <context-root>/SecurityTest</context-root> <class-loader delegate="true"/> <jsp-config> <property name="keepgenerated" value="true"> <description>Keep a copy of the generated servlet class' java code.</description> </property> </jsp-config> <security-role-mapping> <role-name>root</role-name> <group-name>root</group-name> </security-role-mapping> </glassfish-web-app> можно сказать все как по учебнику, но при авторизации, при вводе даже верного пароля не логинится и в логах пишется следующее [#|2012-01-31T13:24:40.506+0600|WARNING|glassfish3.1|javax.enterprise.system.container.web.com.sun.web.security|_ThreadID=120;_ThreadName=Thread-1;|WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception|#] [#|2012-01-31T13:24:40.506+0600|WARNING|glassfish3.1|javax.enterprise.system.container.web.com.sun.web.security|_ThreadID=120;_ThreadName=Thread-1;|Exception com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception at com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin(LoginContextDriver.java:394) at com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:240) at com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:153) at com.sun.web.security.RealmAdapter.authenticate(RealmAdapter.java:483) at com.sun.web.security.RealmAdapter.authenticate(RealmAdapter.java:425) at org.apache.catalina.authenticator.BasicAuthenticator.authenticate(BasicAuthenticator.java:176) at com.sun.web.security.RealmAdapter.invokeAuthenticateDelegate(RealmAdapter.java:1192) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:551) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:623) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:9 at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822) at com.sun.grizzly.comet.CometEngine.executeServlet(CometEngine.java:444) at com.sun.grizzly.comet.CometEngine.handle(CometEngine.java:308) at com.sun.grizzly.comet.CometAsyncFilter.doFilter(CometAsyncFilter.java:87) at com.sun.grizzly.arp.DefaultAsyncExecutor.invokeFilters(DefaultAsyncExecutor.java:171) at com.sun.grizzly.arp.DefaultAsyncExecutor.interrupt(DefaultAsyncExecutor.java:143) at com.sun.grizzly.arp.AsyncProcessorTask.doTask(AsyncProcessorTask.java:94) at com.sun.grizzly.http.TaskBase.run(TaskBase.java:193) at com.sun.grizzly.http.TaskBase.execute(TaskBase.java:175) at com.sun.grizzly.arp.DefaultAsyncHandler.handle(DefaultAsyncHandler.java:145) at com.sun.grizzly.arp.AsyncProtocolFilter.execute(AsyncProtocolFilter.java:204) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:619) Caused by: javax.security.auth.login.LoginException: Security Exception at javax.security.auth.login.LoginContext.invoke(LoginContext.java:856) at javax.security.auth.login.LoginContext.access$000(LoginContext.java:186) at javax.security.auth.login.LoginContext$4.run(LoginContext.java:683) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680) at javax.security.auth.login.LoginContext.login(LoginContext.java:579) at com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin(LoginContextDriver.java:382) ... 36 more Caused by: java.lang.SecurityException at javax.security.auth.login.LoginContext.invoke(LoginContext.java:857) ... 42 more |#] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 12:41:54 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
Вladimir, Это весь стек трейс? Глубже ничего нету? Если есть - выкладывайте, если нет - попробуйте поставить брейкпоинт на java.lang.SecurityException и посмотрите, что там реально происходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 13:35:51 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
Ну а вообще вам, разумеется, надо искать способ преобразовать пароль из текста к виду, который используется в оракле. Как это сделать - хз. Я бы начал с чтения доки по ораклу, что бы понять, как там хранятся пароли. Потом погуглил бы, так как наверняка вы не первый, кто хочет сделать такое. Если гугл не поможет, то варианты такие: 1) Писать свой реалм для работы с ораклом 2) Научиться перегонять оракловский пароль в текст, а потом шифровать его одним из известных Glassfish алгоритмов. 3) Может быть можно имплементировать свой алгоритм преобразования и как-то подсунуть его Glassfish, ну типа Digest Algorithm = MyCustomAlgorithm. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 13:43:25 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
я что-то не пойму. Какой пароль к СУБД, если пулинг? - либо нет пулинга и авторизация в СУБД - либо пулинг и ПРОКСИ авторизация. IMHO не надо смешивать обе технологии. может вот это поможет? http://habrahabr.ru/blogs/java/92608/ ______________________________________________ "Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн. AutoPOI.ru — ГИС-технологии для Oracle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 14:44:47 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
Petro123я что-то не пойму. Какой пароль к СУБД, если пулинг? - либо нет пулинга и авторизация в СУБД - либо пулинг и ПРОКСИ авторизация. IMHO не надо смешивать обе технологии.Речь не об этом. Есть коннекшн к базе - тут вопросов нет. А в базе так же есть информация о пользователях в стандартных оракловских табличках, т.е. пользователь приложения = пользователь Oracle. И надо научить Glassfish аутентифицировать пользователей по этой информации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 14:52:49 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
svenomА в базе так же есть информация о пользователях в стандартных оракловских табличках, т.е. пользователь приложения = пользователь Oracle. нет. Мы это обсуждали. Либо create user aaaaa password bbbbb тогда это аут-ия СУБД и на каждого юзверя по 1 схеме. Либо на каждого из пула берётся коннект ОДНОГО суперЮзверя. (Веб) Есть ещё смешанные варианты ЗЫ Если пассс и имя в стандартной табличке, тогда обычное select ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 15:06:12 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
svenomт.е. пользователь приложения = пользователь Oracle. вот это не верно. Второй это CREATE USER ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 15:07:44 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
Petro123svenomА в базе так же есть информация о пользователях в стандартных оракловских табличках, т.е. пользователь приложения = пользователь Oracle. нет. Мы это обсуждали. Либо create user aaaaa password bbbbb тогда это аут-ия СУБД и на каждого юзверя по 1 схеме. Либо на каждого из пула берётся коннект ОДНОГО суперЮзверя. (Веб) Есть ещё смешанные варианты ЗЫ Если пассс и имя в стандартной табличке, тогда обычное selectВот странно - вы вроде и понимаете, а вроде и нет. Еще раз попытаюсь пояснить за автора. 1) Есть СУБД Oracle. 2) В СУБД есть специальный системынй пользователь и ассоциированная с ним схема (или чужая схема, но к которой у пользователя есть объектный привилегии), через которого AppServer подключается к БД. 3) Далее, в этой жу СУБД есть еще 100500 других пользователей у которых нет никаких схем (ну есть то они есть, просто пустые) с точки зрения приложения. Нам плевать на их схемы. Важно то, что в системных таблицах СУБД хранятся их данные - пароль и роли. 4) Идея автора заключается в том, что бы приспособить стандартный JDBCRealm Глассфиша так, что бы он мог аутентифицировать пользователей приложения по данным из этих системных таблиц Oracle. Все, точка. Больше нам эти пользователи ни для чего не нужны. Эта задача хитрая, возможно глупая, но она решаемая. Вопрос - как ее решить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 15:13:36 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
ну дак я и спрашиваю про то ЧТО Я НЕ ПОНЯЛ Я ж субд больше знаю, чем аппсервер svenom3) Далее, в этой жу СУБД есть еще 100500 других пользователей у которых нет никаких схем (ну есть то они есть, просто пустые) дак есть или нет? - например, админка. Как узнать список пользователей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 15:27:03 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
или ещё проще - код создания нового пользователя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 15:27:58 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
Petro123дак есть или нет? - например, админка. Как узнать список пользователей? Что есть или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 15:37:23 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
svenom3) Далее, в этой жу СУБД есть еще 100500 других пользователей у которых нет никаких схем (ну есть то они есть, просто пустые) с точки зрения приложения. Нам плевать на их схемы. Важно то, что в системных таблицах СУБД хранятся их данные - пароль и роли. 4) Идея автора заключается в том, что бы приспособить стандартный JDBCRealm Глассфиша так, что бы он мог аутентифицировать пользователей приложения по данным из этих системных таблиц Oracle. Все, точка. Больше нам эти пользователи ни для чего не нужны. Эта задача хитрая, возможно глупая, но она решаемая. Вопрос - как ее решить.в пункте 3 ошибка - там НЕ ХРАНИТСЯ пароль. там хранится нечто, нужное для алгоритма авторизации СУБД (для простоты назовем хэш пароля). авторизация в этом случае возможна только использованием спец-средств СУБД. как следствие 4-й пункт не решается через JDBCRealm в принципе. правильное решение это написание своего реалма который для авторизации вызывает функции Oracle. Реалм выступает прослойкой между тем как АппСервер запрашивает API авторизации и API Oracle для прохождения авторизации. Для Спринг проще показать примеры как это должно работать. Работа с Realms не стандартизована, потому нужно читать доки по конкретному серверу (а часто и по конкретной версии сервера). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 15:43:48 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
Petro123- например, админка. Как узнать список пользователей? зайти в стандартную админку СУБД и посмотреть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 15:51:26 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
svenomPetro123дак есть или нет? - например, админка. Как узнать список пользователей? Что есть или нет? я сразу отвечу: - в 1 случае - select users_name from sys.table_users (служебная таблица) - в 2 случае - select users_nameMy from ORM (пользовательская таблица) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 15:51:45 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
VoDAPetro123- например, админка. Как узнать список пользователей? зайти в стандартную админку СУБД и посмотреть намёк на EM? Тогда в простом случае, это 1000 схем-логинов (пускай пустых) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 15:53:46 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
Petro123VoDAзайти в стандартную админку СУБД и посмотреть намёк на EM? Тогда в простом случае, это 1000 схем-логинов (пускай пустых)Да. В предыдущих твоих постах я не увидел проблемы, только вопрос "как посмотреть?". Посмотреть просто. Для этого уже давно сделаны средства. Так что телепатирую, что ты пытаешься намекнуть на сложность чего то иного, но не просто "посмотреть список логинов" ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 15:56:46 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
VoDA, да простой был вопрос: - через create user Оракла! создаётся новый пользователь или через insert в оракле. Но ты сказал уже, что проще в спринг. ОК. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 16:07:36 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
Petro123VoDA, да простой был вопрос: - через create user Оракла! создаётся новый пользователь или через insert в оракле. Но ты сказал уже, что проще в спринг. ОК.Спринг выполняет авторизацию либо встроенными методами (plain JDBC) ибо через собственный алгоритм. Собственный алгоритм может действовать как программисту удобно или нужно сделать - хоть JDBC, хоть JPA, хоть отправлять запросы на авторизацию к СУБД. Практически также работают Realms, но API для realms не специфицированы, потому под каждый сервер нужно было писать по своему. В Java EE 6 доработали авторизацию, но насколько они догнали Spring по удобству мне не ведомо. Потому при выборе между Spring и Realm - проще работать с Spring Security. На вопрос же "через create user Оракла! создаётся новый пользователь или через insert в оракле" это не отвечает. Тут правильно заходить с позиции "что хотите получить?" или "какие требования в ТЗ?" Если требование в ТЗ работать через insert/select, то это можно сделать стандартными средствами Spring Security или созданными производителем сервера Realm. Если требование в ТЗ работать через create user в Oracle, то для этого вероятнее всего придется дописать свой Manager для Spring Security или свой Realm для конкретной версии конкретного сервера. И выбор между этими вариантами лежит на авторе топика, а не конкретной технологии. "Если не знаешь куда идти, то ни один ветер не будет попутным" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 16:34:58 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
VoDA, Всё верно, но я одно не пойму. Я вот с такими _твоими_ словами больше согласен: автордля java проще авторизацию сделать на своей стороне. при этом общение с СУБД идет под одним аккаунтом и через пул коннектов. пул коннектов - сильно лучше для большого числа пользователей ибо для работы применяется меньшее количество подключений. я полностью их разделяю, т.к. критерий-требование не insert в ТЗ, а веб+пул. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 16:47:58 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
можно ещё проще: - короткие транзакции не делают с оракловой аутентификацией (create user...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2012, 16:49:25 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
как много написали пока отсутствовал... svenom правильно разъяснил, какова была моя попытка реализовать авторизацию через jdbc realm, после этой попытки понял, что через обычный jdbcrealm не получится, т.к. в оракле - в поле password это вовсе не пароль а нечто зашифрованное. и возвращаясь к изначальному моему вопросу авторпосоветуйте, как лучше реализовать авторизацию в приложении? самый простой вариант, это в сделать коннект к базе по данным пользователя и вытащить его роль, если она, скажем, админ, то ему можно все, если просто юзер, то заблокировать кнопочки, выполняющие post, put запросы. а хотелось бы еще, ставить некий запрет для определенной роли на выполнение get, post или put запросов. по поводу своего реалма, не подскажите подробного примера для разбора как его написать.. приложение smartGWT, сервер glassfish 3.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2012, 06:02:22 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
хотя, пропустил сразу ссылку http://habrahabr.ru/blogs/java/92608/, попробую реализовать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2012, 06:09:28 |
|
||
|
веб-приложение, авторизация
|
|||
|---|---|---|---|
|
#18+
Видимо у вас так мало времени, что вы свой тред не читаете. Иначе ответили бы на вопрос: - как сейчас происходит соединение. Есть пул или нет? Кто дал идею заводить роли и пользователей именно Оракловых? svenom без сомнения верно отправил вас читать документацию. Разве там написано: ВladimirUser Table: sys.dba_users - что надо выставлять системные таблицы оракла с рутовыми паролями наружу в аппСервер в конфиги? - что для авторизации необходимо в БД заводить пользователя\роли в SYS? - что можно соединить архитектуру десктоп-корпоратив-длинные и пул-веб-короткие? Я не спорю, SmartGWT позволяет писать так и так... только там есть ньюансы. Это же безопасность Удачи! ______________________________________________ "Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн. AutoPOI.ru — ГИС-технологии для Oracle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2012, 10:04:54 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37644022&tid=2132661]: |
0ms |
get settings: |
17ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
17ms |
get forum data: |
4ms |
get page messages: |
80ms |
get tp. blocked users: |
2ms |
| others: | 353ms |
| total: | 539ms |

| 0 / 0 |
