2


我使用 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

服务属性:

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

3 回答 3

0

使用像 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>
于 2012-09-18T15:34:12.530 回答
0

您可以在构建过程中使用 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/

于 2015-07-07T16:37:16.703 回答
0

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

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-07-26T07:16:17.800 回答