Как настроить 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
Смотрите ниже статью в качестве примера. Он заботится как об аутентификации, так и авторизации.