Как настроить 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 Царство