2012-04-08 10 views
2


Ich verwende Shiro, um die Authentifizierung für meinen CXF-Webdienst zu implementieren. Ich benutze ein jdbc-Realm und konfiguriere es mit Hilfe einer ini-Datei (unten angehängt). Die Authentifizierungsdaten bleiben in der gleichen Datenbank erhalten wie die anderen Daten, die ich brauche, aber für den Rest des Systems verwende ich eine Eigenschaftendatei (kann auch unten gefunden werden), um die Verbindungsinformation zu liefern.Shiro: Code-Duplizierung in der Datenquellenkonfiguration

Jetzt offensichtlich die Daten für die Datenquelle in beiden Fällen ist die gleiche, aber ich finde keinen Weg, um diese Code-Duplikation zu lösen. Hat jemand, der mehr Erfahrung mit der Entwicklung von Webapplikationen hat, eine Lösung? Ich könnte sowohl die Konfiguration von shiro als auch des restlichen Systems ändern, wenn es helfen würde.

Vielen Dank im Voraus,
Zakum

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/ 

Antwort

0

Verwenden Sie einen Behälter wie Spring Shiro und Ihre JDBC-Verbindungen zu konfigurieren. Dann können Sie die dataSource als Referenz in den JDBCRealm übergeben.

+0

Ich fürchte, ich werde nicht in der Lage sein, Ihre Antwort zu überprüfen, weil ich nicht mehr an diesem Projekt arbeite. Ich werde meinen Nachfolger kontaktieren, um zu sehen, ob er daran interessiert ist, das auszuprobieren und darüber zu berichten. Davon abgesehen mag ich die Idee, den Frühling zu benutzen, nicht, weil wir ihn speziell für diesen Zweck einführen müssten, was ein wenig übertrieben zu sein scheint. – Zakum

0

Sie könnten Token während Ihres Build-Prozesses automatisch mit Ant oder Maven (unter anderem) ersetzen.
Hier ist ein Beispiel Ant verwenden.

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

Im * .template * Dateien, die Sie Token verwenden würde:

ds.databaseName = @[email protected] 

, die mit den realen Werten während des Build-Prozesses ersetzt bekommen würde:

(und es wäre natürlich besser, die Tokens/Werte in einer Konfigurationsdatei anzugeben und die Ersetzungen mit globbing patte auf eine Liste von Dateien anzuwenden rns)

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

0

Obwohl dies eine alte Frage ist, ich hatte eine ähnliche Abfrage und ich löste es die folgende Art und Weise. Ich hoffe, es wird anderen helfen.

Shiro ini kann verwendet werden, um jede Klasse zu konfigurieren. Für die Datenquelle habe ich meine anwendungsspezifische Klasse so geschrieben.

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; 
    } 
} 

Jetzt in der ini-Datei, habe ich die gleiche Datenquelle Bezug auf beide, die jdbc Reich und meine Klasse.

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