Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Tomcat DataSourceRealm


Автор: garbuz 19.1.2009, 15:30
Пытаюсь сделать аутентификацию через Tomcat DataSourceRealm.
Пишу в server.xml
Код

<Realm className="org.apache.catalina.realm.DataSourceRealm" 
        debug="99"
        dataSourceName="jdbc/zeDS"
        userTable="users" userNameCol="username" userCredCol="user_pass"
        userRoleTable="user_roles" roleNameCol="role_name"/>


web.xml
Код

<resource-ref>
        <description>DB Connection</description>
        <res-ref-name>jdbc/zeDS</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>


Context.xml
Код

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/ClientApp">

    <Resource
      name="jdbc/zeDS"
      type="javax.sql.DataSource"
      username="root"
      password=""
      driverClassName="com.mysql.jdbc.Driver"
      maxIdle="2"
      maxWait="5000"
      validationQuery="SELECT 1"
      url="jdbc:mysql://127.0.0.1:3306/testdb"
      maxActive="4">
   </Resource>
</Context>


Кидает 
Код

19.01.2009 14:59:04 org.apache.catalina.realm.DataSourceRealm open
SEVERE: Exception performing authentication
javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
    at org.apache.naming.NamingContext.lookup(NamingContext.java:770)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
    at org.apache.catalina.realm.DataSourceRealm.open(DataSourceRealm.java:402)
    at org.apache.catalina.realm.DataSourceRealm.authenticate(DataSourceRealm.java:283)
    at org.apache.catalina.authenticator.FormAuthenticator.authenticate(FormAuthenticator.java:258)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:417)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    at java.lang.Thread.run(Thread.java:619)



Что не так?


Автор: ivg 19.1.2009, 16:12
Цитата(garbuz @  19.1.2009,  17:30 Найти цитируемый пост)
Что не так?

Ну как же так? DataSource вы "мапите" на уровне контекста приложения, а Realm прописываете на уровне хоста. Где логика? smile Попробуйте прописать Realm на уровне контекста.

Автор: garbuz 19.1.2009, 16:22
Цитата(ivg @  19.1.2009,  16:12 Найти цитируемый пост)
Ну как же так? DataSource вы "мапите" на уровне контекста приложения, а Realm прописываете на уровне хоста. Где логика? smile Попробуйте прописать Realm на уровне контекста. 


Код

<Realm className="org.apache.catalina.realm.DataSourceRealm" 
        debug="99"
        localDataSource="true"
        dataSourceName="jdbc/zeDS"
        userTable="users" userNameCol="username" userCredCol="user_pass"
        userRoleTable="user_roles" roleNameCol="role_name"/>


Оно? 

Автор: ivg 19.1.2009, 16:29
Цитата(garbuz @  19.1.2009,  18:22 Найти цитируемый пост)
Оно?  

Да, и плюс, я имелл ввиду, прописать тег <Realm... /> внутри тега <Context... >... </Context>

Автор: garbuz 19.1.2009, 17:03
Цитата(ivg @  19.1.2009,  16:29 Найти цитируемый пост)
Да, и плюс, я имелл ввиду, прописать тег <Realm... /> внутри тега <Context... >... </Context> 

Эээ, вот тут что-то я не догнал.
Поместить описание realm в context.xml?
А что туда писать? То же что и в server.xml?
Так?

Код

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/ClientApp">


    <Resource
      name="jdbc/zeDS"
      type="javax.sql.DataSource"
      username="root"
      password=""
      driverClassName="com.mysql.jdbc.Driver"
      maxIdle="2"
      maxWait="5000"
      validationQuery="SELECT 1"
      url="jdbc:mysql://127.0.0.1:3306/testdb"
      maxActive="4">
   </Resource>

    <Realm className="org.apache.catalina.realm.DataSourceRealm"
        debug="99"
        localDataSource="true"
        dataSourceName="jdbc/zeDS"
        userTable="users" userNameCol="username" userCredCol="user_pass"
        userRoleTable="user_roles" roleNameCol="role_name"/>
    
</Context>


Добавлено через 14 минут и 14 секунд
Все получилось. 
ivg, ты опять выручил! Спасибо огромное  smile 

Автор: ivg 19.1.2009, 17:18
Цитата(garbuz @  19.1.2009,  19:03 Найти цитируемый пост)
Так?

Попробовали? Работает? Из server.xml, конечно, описание realm надо убрать.

Автор: garbuz 19.1.2009, 17:52
Цитата(ivg @  19.1.2009,  17:18 Найти цитируемый пост)
Попробовали? Работает? Из server.xml, конечно, описание realm надо убрать. 

Да, все работает, сперва из server.xml ничего не убирал, но тоже работало все, теперь убрал, тоже работает smile Видимо у context.xml приоритет выше )

Автор: garbuz 19.1.2009, 20:27
У меня еще вопрос, но он скорее уже относится к sql.
В доках к томкату написан такой пример создания таблиц пользователей и ролей
Код
    
create table users (
  user_name         varchar(15) not null primary key,
  user_pass         varchar(15) not null
);

create table user_roles (
  user_name         varchar(15) not null,
  role_name         varchar(15) not null,
  primary key (user_name, role_name)
);



Код

<Realm className="org.apache.catalina.realm.DataSourceRealm" debug="99"
   dataSourceName="jdbc/authority"
   userTable="users" userNameCol="user_name" userCredCol="user_pass"
   userRoleTable="user_roles" roleNameCol="role_name"/>



Хочу изобразить что-то типа такого
Код

CREATE TABLE `user_roles` (
  `role_id` int(10) NOT NULL auto_increment,
  `role_name` varchar(50) NOT NULL,
  PRIMARY KEY  (`role_id`)
);

CREATE TABLE `users` (
  `user_id` int(10) NOT NULL auto_increment,
  `user_name` varchar(50) NOT NULL,
  `user_pass` varchar(50) NOT NULL,
  `user_role` int(10) NOT NULL,
  foreign key (`user_role`) references user_roles(`role_id`) 
  PRIMARY KEY  (`user_id`)
);


Указывая в context.xml следующее
Код

<Realm className="org.apache.catalina.realm.DataSourceRealm"
        debug="99"
        localDataSource="true"
        dataSourceName="jdbc/zeDS"
        userTable="users" userNameCol="user_name" userCredCol="user_pass"
        userRoleTable="users" roleNameCol="user_role"/>


и при по пытке пройти авторизацию, получаем access denied, можно как-нибудь так сделать?
Если в качестве вторичного ключа указать не id роли, а ее имя, тогда все работает, но мне кажется, что это тоже как-то не правильно... smile 

Автор: ivg 19.1.2009, 22:41
MySQL?
Код

CREATE TABLE `roles` (
  `role_id` int(10) NOT NULL auto_increment,
  `role_name` varchar(50) NOT NULL,
  PRIMARY KEY  (`role_id`),
  UNIQUE KEY (`role_name`)
)TYPE=InnoDB;
CREATE TABLE `users` (
  `user_id` int(10) NOT NULL auto_increment,
  `user_name` varchar(50) NOT NULL,
  `user_pass` varchar(50) NOT NULL,
  PRIMARY KEY  (`user_id`),
  UNIQUE KEY (`user_name`)
)TYPE=InnoDB;

CREATE TABLE `users_roles` (
  `user_id` int(10) NOT NULL,
  `role_id` int(10) NOT NULL,
  foreign key (`role_id`) references roles(`role_id`)
    on delete cascade on update cascade,
  foreign key (`user_id`) references users(`user_id`)
    on delete cascade on update cascade
)TYPE=InnoDB;

CREATE VIEW `roles_view` AS
select `users`.`user_name`,
       `roles`.`role_name`
  from `users`, `roles`, `users_roles`
 where `users_roles`.`role_id` = `roles`.`role_id`
   and `users_roles`.`user_id` = `users`.`user_id`;

У user'а может быть несколько ролей.
Код

<Realm className="org.apache.catalina.realm.DataSourceRealm"
        debug="99"
        localDataSource="true"
        dataSourceName="jdbc/zeDS"
        userTable="users" userNameCol="user_name" userCredCol="user_pass"
        userRoleTable="roles_view" roleNameCol="role_name"/>

Автор: garbuz 19.1.2009, 23:14
Спасибо, завтра попробую! smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)