如何配置JDBCRealm以从JNDI获取其DataSource

时间:2013-07-03 06:22:11

标签: jndi shiro jdbcrealm

如何使用JDBCRealm来处理servlet中的用户身份验证和授权?我能找到的唯一例子是在web.xml中创建数据源(例如Authentication against database using shiro 1.2.1)。

我不想在我的源代码树中包含数据库凭据(出于显而易见的原因),并且更喜欢通过JNDI使用Context定义的DataSource,就像我在其他每个servlet项目中用于任何其他目的的其他RDBMS一样我已经开发了。

如何配置Shiro JDBCRealm从JNDI获取DataSource

4 个答案:

答案 0 :(得分:21)

Vrushank的回答非常接近:你不需要在这里继承JdbcRealm - 你可以使用Shiro的JndiObjectFactory来获取DataSource,然后在配置JdbcRealm时引用该DataSource:

[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应用程序,请将文件保存在WEB-INF/shiro.ini

另请参阅

答案 1 :(得分:2)

我对@Les Hazlewood的回答和@Recurse的评论发表了评论,但可能是新的答案是更好的选择。

在我的情况下,我必须在weblogic上使用JDNI数据源名称,在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

答案 2 :(得分:2)

对于Shiro使用JDBC领域的权限,这个参数是必不可少的:

jdbcRealm.permissionsLookupEnabled = true 

我浪费了很多时间,因为此选项的默认值为false。换句话说,如果你不放这个选项,Shiro总会返回一个空的权限列表。

答案 3 :(得分:-3)

您需要通过扩展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