如何使用JDBCRealm
来处理servlet中的用户身份验证和授权?我能找到的唯一例子是在web.xml
中创建数据源(例如Authentication against database using shiro 1.2.1)。
我不想在我的源代码树中包含数据库凭据(出于显而易见的原因),并且更喜欢通过JNDI使用Context定义的DataSource,就像我在其他每个servlet项目中用于任何其他目的的其他RDBMS一样我已经开发了。
如何配置Shiro JDBCRealm
从JNDI获取DataSource
?
答案 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
请参阅以下文章作为示例。它负责身份验证和授权。