【问题标题】:Shiro: code-duplication in datasource configurationShiro:数据源配置中的代码重复
【发布时间】:2012-04-21 09:56:16
【问题描述】:


我使用 shiro 为我的 CXF Web 服务实现身份验证。我正在使用 jdbc-Realm 并在 ini 文件的帮助下对其进行了配置(附在下面)。身份验证数据与我需要的其他数据一样保存在同一个数据库中,但对于系统的其余部分,我使用属性文件(也可以在下面找到)来提供连接信息。

现在显然两种情况下数据源的数据是相同的,但我似乎没有找到解决此代码重复的方法。有没有比 web 应用程序开发经验更丰富的人有解决方案?如果有帮助的话,我可以同时更改 shiro 和系统其余部分的配置。

提前致谢,
扎库姆

shiro.ini:

[main]
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.permissionsLookupEnabled = true
jdbcRealm.authenticationQuery = SELECT password FROM users WHERE username = ?;

ds = org.postgresql.ds.PGSimpleDataSource
ds.user = postgres
ds.password = password
ds.databaseName = servicedb
ds.serverName = localhost
ds.portNumber = 5432

jdbcRealm.dataSource = $ds
securityManager.realms = $jdbcRealm

service.properties:

db. It looks like:
db.name = servicedb
db.user = postgres
db.password = password
db.url = //localhost:5432/

【问题讨论】:

    标签: configuration datasource code-duplication shiro


    【解决方案1】:

    使用像 Spring 这样的容器来配置 Shiro 和您的 JDBC 连接。然后您可以将 dataSource 作为引用传递给 JDBCRealm。

    <bean id="dataSourceBean" class="com.apache.commons.dbcp.BasicDataSource>
      <property name="driverClassName" value"class for driver"/>
      ... more setup for the data source ...
    </bean>
    
    <bean id="jdbcRealm" class="org.apache.shiro.realm.jdbc.JdbcRealm">
      <property name="dataSource" ref="dataSourceBean"/>
      <property name="permissionsLookupEnabled" value="true"/>
      <property name="authenticationQuery" value="SELECT password FROM users WHERE username = ?"/>
    </bean>
    

    【讨论】:

    • 恐怕我无法验证你的答案,因为我不再从事这个项目了。我会联系我的继任者,看看他是否有兴趣尝试一下,然后汇报。话虽如此,我不喜欢使用 spring 的想法,因为我们必须为此专门引入它,这似乎有点矫枉过正。
    【解决方案2】:

    您可以在构建过程中使用 Ant 或 Maven(以及其他)自动替换令牌。
    这是一个使用 Ant 的示例:

    <copy file="shiro.template.ini" tofile="shiro.ini" overwrite="true" />
    <replace file="shiro.ini" token="@DB_NAME@" value="servicedb"/>
    

    在 *.template.* 文件中您将使用标记:

    ds.databaseName = @DB_NAME@
    

    在构建过程中将被实际值替换:

    ds.dataBaseName = servicedb
    

    (在配置文件中指定标记/值并使用通配模式将替换应用到文件列表显然会更好)

    蚂蚁https://ant.apache.org/manual/Tasks/replace.html
    Mavenhttps://code.google.com/p/maven-replacer-plugin/

    【讨论】:

      【解决方案3】:

      虽然这是一个老问题,但我有一个类似的查询,我通过以下方式解决了它。希望对其他人有所帮助。

      Shiro ini 可用于配置任何类。对于数据源,我已经编写了我的应用程序特定类。

      import javax.sql.DataSource;
      
      public class MyConfig
      {
          private static DataSource dataSource;
      
          public void setDataSource(Object ds)
          {
              dataSource = (DataSource)ds;
          }
      
          public static DataSource getDataSource() // your application will use this method to get data source.
          {
              return dataSource;
          }
      }
      

      现在在 ini 文件中,我将相同的数据源引用传递给 jdbc 领域和我的类。

      myConfig = my.package.MyConfig
      myConfig.dataSource = $ds
      

      【讨论】:

        猜你喜欢
        • 2017-01-16
        • 2012-04-30
        • 2021-04-07
        • 1970-01-01
        • 2017-06-04
        • 1970-01-01
        • 2013-07-28
        • 2020-01-18
        • 1970-01-01
        相关资源
        最近更新 更多