【问题标题】:How to configure JDBCRealm to obtain its DataSource from JNDI如何配置 JDBCRealm 从 JNDI 获取其 DataSource
【发布时间】:2013-06-30 17:33:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: jndi shiro jdbcrealm


    【解决方案1】:

    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)你还需要 dataSource.resourceRef = true;并且,2)您也可以使用 jdbc/myDataSource 并且 URI 的其余部分将为您预先设置。
    • URI 将被添加为您节省了我的一天。所以在我的情况下,我必须在 weblogic 上只使用数据源名称,在 tomcat 上使用完整路径
    • 如果我需要使用两个数据源会发生什么
    • 我第二次 Recurse 的评论。使用 tomcat,我必须添加 dataSource.resourceRef = true 以及 dataSource.resourceName = jdbc/TestDB。
    【解决方案2】:

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

    jdbcRealm.permissionsLookupEnabled = true 
    

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

    【讨论】:

      【解决方案3】:

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

      就我而言,我只能在 weblogic 上使用 JDNI 数据源名称,在 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
      

      网络逻辑

       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
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2019-05-28
          • 1970-01-01
          • 2012-03-05
          • 2015-09-02
          • 1970-01-01
          • 2012-08-17
          • 1970-01-01
          • 2016-03-18
          • 2012-02-22
          相关资源
          最近更新 更多