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

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

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

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

4 ответов


ответ Врушанка был очень близок: вам не нужно подкласс JdbcRealm здесь - вы можете использовать Shiro's JndiObjectFactory чтобы получить источник данных, а затем ссылаться на этот источник данных при настройке 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.

посмотреть Также


Я прокомментировал ответ @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

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

jdbcRealm.permissionsLookupEnabled = true 

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


вам нужно будет создать собственную собственную область, расширив 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