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

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

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

Как настроить Shiro JDBCRealm для получения DataSource из JNDI?

Ответы

Ответ 1

Ответ Vrushank был очень близок: вам не нужно подклассифицировать JdbcRealm здесь - вы можете использовать Shiro JndiObjectFactory, чтобы получить 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.

См. также

Ответ 2

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

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

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

Ответ 3

Для Сиро для работы с разрешениями в области JDBC этот параметр необходим:

jdbcRealm.permissionsLookupEnabled = true 

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

Ответ 4

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

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

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

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

Апачи Сиро JDBC Царство