Как настроить JDBCRealm для получения его источника данных из JNDI

Как вы используете JDBCRealm обрабатывать аутентификацию и авторизацию пользователей в сервлетах? Единственный пример, который я могу найти, - это создать источник данных в web.xml (например, Аутентификация по базе данных с использованием shiro 1.2.1).

Я не хочу включать учетные данные базы данных в мое дерево исходных текстов (по очевидным причинам) и предпочел бы использовать Источник данных, определенный с помощью контекста, через JNDI, как я использую для каждой другой СУБД, которую я использовал для любых других целей, в любом другом проекте сервлета, который я разработал.,

Как вы настраиваете Широ JDBCRealm чтобы получить его DataSource от JNDI?

4 ответа

Решение

Ответ Врушанка был очень близок: вам не нужно создавать здесь подкласс JdbcRealm - вы можете использовать JndiObjectFactory от Shiro, чтобы получить DataSource, а затем ссылаться на этот DataSource при настройке JdbcRealm:

[main]
dataSource = org.apache.shiro.jndi.JndiObjectFactory
dataSource.resourceName = java://app/jdbc/myDataSource

jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource = $dataSource
#addt'l config

Для веб-приложения сохраните файл в WEB-INF/shiro.ini,

Смотрите также

Для Широ, чтобы работать с разрешениями с областью JDBC, этот параметр является обязательным:

jdbcRealm.permissionsLookupEnabled = true 

Я потратил много времени на это, потому что для этой опции по умолчанию установлено значение false. Другими словами, если вы не включите эту опцию, Широ всегда возвращает пустой список разрешений.

Я прокомментировал ответ @Les Hazlewood и комментарий @Recurse, но, возможно, новый ответ - лучший вариант.

В моем случае я должен использовать только имя источника данных JDNI на weblogic и полный путь на tomcat:

Кот:

 ds = org.apache.shiro.jndi.JndiObjectFactory   
 ds.requiredType = javax.sql.DataSource  
 ds.resourceName = java:/comp/env/oracle/pportal_dev

 # JDBC realm config  
 jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm  
 jdbcRealm.permissionsLookupEnabled = true 
 jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
 jdbcRealm.dataSource = $ds

Weblogic

 ds = org.apache.shiro.jndi.JndiObjectFactory   
 ds.requiredType = javax.sql.DataSource   
 ds.resourceName = oracle/pportal_dev

 # JDBC realm config  
 jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm  
 jdbcRealm.permissionsLookupEnabled = true 
 jdbcRealm.dataSource = $ds

Заметка

ds.resourceName = java:/comp/env/oracle/pportal_dev 
vs
ds.resourceName = oracle/pportal_dev

Вам нужно будет создать свое собственное Царство, расширив JdbcRealm для программного поиска источника данных через предоставленный JNDI.

Затем вы можете передать JNDI как свойство в shiro.ini

[main]
# realms to be used
customSecurityRealm=package.to.your.CustomRealm
customSecurityRealm.jndiDataSourceName=java:app/jdbc/myDatasource

Смотрите ниже статью в качестве примера. Он заботится как об аутентификации, так и авторизации.

Apache Shiro JDBC Realm

Другие вопросы по тегам