如何使用JDBCRealm
来处理servlet中的用户身份验证和授权?我能找到的唯一例子是在web.xml
中创建DataSource(例如使用shiro 1.2.1对数据库进行身份验证)
我不想在我的源树中包括数据库凭据(出于明显的原因),并且更喜欢通过JNDI使用上下文定义的DataSource,就像我在开发的每个其他servlet项目中为任何其他目的使用的所有其他RDBMS一样。
如何配置Shiro JDBCRealm
以从JNDI获取其DataSource
?
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
下。
另请参阅
- https://github.com/danielmt/shiro-primefaces-example/blob/master/src/main/webapp/WEB-INF/shiro.ini
Shiro要使用JDBC领域的权限,这个参数是必不可少的:
jdbcRealm.permissionsLookupEnabled = true
我在这上面浪费了很多小时,因为这个选项的默认值是false。换言之,如果不设置此选项,Shiro总是返回一个空的权限列表。
我评论了@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
您需要通过扩展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