2012-04-08 43 views
2


我使用shiro爲我的CXF Web服務實現身份驗證。我正在使用jdbc-Realm,並在ini文件的幫助下對其進行配置(附後)。身份驗證數據與我需要的其他數據一樣被保存在同一個數據庫中,但對於系統的其餘部分,我使用屬性文件(也可以在下面找到)來提供連接信息。Shiro:數據源配置中的代碼重複

現在很明顯,在這兩種情況下數據源的數據是相同的,但我似乎找不到解決此代碼重複的方法。任何有經驗的開發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/ 

回答

0

使用像Spring容器配置四郎和你的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> 
+0

恐怕我無法驗證你的答案,因爲我不再在這個項目上工作。我會聯繫我的繼任者,看看他是否有興趣嘗試這方面的事情,然後報告。話雖如此,我不喜歡使用spring的想法,因爲我們必須爲此專門介紹它,這看起來有些過火。 – Zakum 2012-09-19 14:48:33

0

您可以在構建過程中使用Ant或Maven(以及其他)自動替換標記。
下面是使用Ant一個例子:

<copy file="shiro.template.ini" tofile="shiro.ini" overwrite="true" /> 
<replace file="shiro.ini" token="@[email protected]" value="servicedb"/> 

在* .template *文件你會使用令牌:

ds.databaseName = @[email protected] 

這將與實際值在構建過程中會被替換:

ds.dataBaseName = servicedb 

(在配置文件中指定標記/值並將替換應用於使用globbing模式的文件列表顯然會更好RNS)

螞蟻https://ant.apache.org/manual/Tasks/replace.html
Maven的https://code.google.com/p/maven-replacer-plugin/

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