Wer in seiner SecurityConfig.java in spring-security 3.2.0 RC2 die Methode protected void registerAu...

Wer in seiner SecurityConfig.java in spring-security 3.2.0 RC2 die Methode protected void registerAuthentication in der WebSecurityConfigurerAdapter.java vermisst

Lösung siehe https://jira.springsource.org/browse/SEC-2336?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel

[#SEC-2336] WebSecurityConfigurerAdapter#registerAuthentication incorrectly states exposed Beans - Spring Projects Issue Tracker

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) throws Exception { web .ignoring() .antMatchers(“/resources/**”, “/favicon.ico”); } …

This was posted on Google+

Maven - Prüfen ob neue Versionen der dependencies verfügbar sind

Hallo, mit dem Plugin “versions-maven-plugin” kann man z.B. bei mvn install anzeigen lassen, ob die dependencies noch aktuell sind:

<plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>versions-maven-plugin</artifactId>
                <version>2.1</version>
                <executions>
                    <execution>
                        <phase>install</phase>
                        <goals>
                            <goal>display-dependency-updates</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

Wenn man das ganze um folgendes erweitert

<goal>display-plugin-updates</goal>

werden auch noch die plugins überprüft. Beispielausgabe:

[INFO] The following dependencies in Dependencies have newer versions:
[INFO] commons-collections:commons-collections ………… 3.2.1 -> 20040616
[INFO] javax:javaee-api …………………………………… 6.0 -> 7.0
[INFO] org.aspectj:aspectjrt ………………………… 1.7.3 -> 1.8.0.M1
[INFO] org.hibernate:hibernate-entitymanager ….. 4.2.7.Final -> 4.3.0.Beta5
[INFO] org.hibernate:hibernate-validator …….. 5.0.1.Final -> 5.1.0.Alpha1
[INFO] org.jadira.usertype:usertype.core ………….. 3.0.0.GA -> 3.1.0.CR8
[INFO] org.jadira.usertype:usertype.spi …………… 3.0.0.GA -> 3.1.0.CR8
[INFO] org.springframework:spring-aop ………… 3.2.4.RELEASE -> 4.0.0.RC1
[INFO] org.springframework:spring-orm ………… 3.2.4.RELEASE -> 4.0.0.RC1
[INFO] org.springframework:spring-oxm ………… 3.2.4.RELEASE -> 4.0.0.RC1
[INFO] org.springframework:spring-test ……….. 3.2.4.RELEASE -> 4.0.0.RC1
[INFO] org.springframework:spring-webmvc ……… 3.2.4.RELEASE -> 4.0.0.RC1
[INFO] org.thymeleaf:thymeleaf-spring3 ………….. 2.0.19 -> 2.1.0.RELEASE
[INFO] xmlunit:xmlunit ……………………………………. 1.3 -> 1.5
[INFO]
[INFO]
[INFO] — versions-maven-plugin:2.1:display-plugin-updates (default) @ default.webapp.core —
[INFO]
[INFO] All plugins with a version specified are using the latest versions.
[INFO]
[WARNING] The following plugins do not have their version specified:
[WARNING] maven-clean-plugin …………………….. (from super-pom) 2.5
[WARNING] maven-deploy-plugin ………………….. (from super-pom) 2.8.1
[WARNING] maven-install-plugin …………………. (from super-pom) 2.5.1
[WARNING] maven-resources-plugin …………………. (from super-pom) 2.6
[WARNING] maven-site-plugin ……………………… (from super-pom) 3.3

Mit dem Plugin lassen sich aber noch weitere Aufgaben zum Thema “Versionen von Artefakten in einer Pom verwalten” übernehmen.

Sicherheit von Passwörtern in Java Anwendungen

Es geht um die Sicherheit, dass das Passwort für dritte nicht einfach einsehbar ist. Aber reicht es das Passwort nicht als Klartext sondern verschlüsselt in der Datenbank abzuspeichern? Nein, den mit Hilfe von Raibow Tabllen kann der Angreifer möglicherweise das richtige Passwort des Hashes erfahren. Um dies zu verhindern gibt es verschiedene Gegenmaßnahmen:

  • Salt Werte verwenden beim erstellen der verschlüsselten Passwörter
  • Passwörter Encrypten bevor sie gespeichert werden
  • Honeyword Passwörter erstellen

Das Passwort Security Modul http://lightszentip.github.io/password-security/ ermöglicht alle drei Maßnahmen. Bei Honeyword geht es darum falsche Passwörter zu generieren um den Angreifer die Wahl zu geben, welches Passwort er für das richtige hält und z.B. nach einem Angriff zu merken wenn die geklauten Passwörter verwendet werden in dem sie mit dem fake Passwörtern übereinstimmen. Bei Passwort Security muss man z.B. beim initialisieren der Klasse bestimmte Parameter mitgeben, welche von der Installation in der das Modul verwendet wird abhängen können. Damit benötigt der Angreifer nicht nur das Passwort sondern auch die Parameter um es zu encrypten und die richtige Verschlüsselung zu kennen. Wenn diese Parameter z.B. aus den System variablen des Rechners kommen und der Angreifer darauf keinen Zugriff hatte, bringen ihm die geklauten Passwörter wenig. Dadurch sind die Passwörter der Benutzer sicherer falls ein Angriff mit Erfolg statt finden sollte.

Graylog2 Server start script

Das folgende Start Script startet einen Graylog2 Server unter ubunut:

/etc/init.d/graylog2-server

#!/bin/sh
#

### BEGIN INIT INFO
# Provides: graylog2-server
# Required-Start: $remote_fs $syslog $network
# Required-Stop: $remote_fs $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start graylog2-server at boot time
# Description: Controls the graylog2-server.
### END INIT INFO

JAVA_CMD=java
PID_FILE=/tmp/graylog2.pid
GRAYLOG2_SERVER_HOME=/opt/graylog2-server

start() {
echo “Starting graylog2-server …”
$JAVA_CMD -jar $GRAYLOG2_SERVER_HOME/graylog2-server.jar > /var/log/graylog2.log 2>&1 &
echo “ startet (‘cat “$PID_FILE”‘).”
}

stop() {
PID=`cat $PID_FILE`
echo “Stopping graylog2-server ($PID) …”
kill $PID
echo “stopped.”
}

restart() {
echo “Restarting graylog2-server …”
stop
sleep 0.5
start
}

case “$1” in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo “Usage $0 {start|stop|restart}” >&2
exit 1
esac
exit 0

Graylog2 Web Interface start script

Das folgende Script startet das web-interface von Graylog2. /etc/init.d/graylog2-web-interface:

#!/bin/bash
#

graylog2-web-interface: graylog2 web interface

#

chkconfig: - 98 02

description: Starts graylog2-web-interface using passenger-standalone. \

### BEGIN INIT INFO

Provides: graylog2-web-interface

Required-Start: $remote_fs $syslog $network

Required-Stop: $remote_fs $syslog $network

Default-Start: 2 3 4 5

Default-Stop: 0 1 6

Short-Description: Start graylog2-web-interface at boot time

Description: Controls the graylog2-web-interface.

END INIT INFO

# config
APP_DIR=/opt/graylog2-web-interface/
ADDR=127.0.0.1
PORT=3000
LOG_FILE=/var/log/graylog2-web-interface.log
ENVIRONMENT=production
SU=/bin/su
. /lib/lsb/init-functions
case “$1” in
start)
echo “Starting graylog2-web-interface”
$SU -l –shell=/bin/bash -c “cd $APP_DIR && passenger start -a $ADDR -p $PORT -e $ENVIRONMENT >> $LOG_FILE” &
;;
stop)
echo “Stopping graylog2-web-interface”
cd $APP_DIR && passenger stop -p $PORT
;;
status)
cd $APP_DIR && passenger status -p $PORT
;;
*)
echo “Usage: $0 start|stop|status” >&2
exit 3
;;
esac
exit 0

JUnit - Daten aus Xml, CSV, Json .. als Liste im Test bereitstellen

Mit Hilfe von DBUnit können Datenbanken mit Daten z.B. aus CSV oder XML Dateien vor einem Test befüllt werden. In einigen Testfällen werden aber auch Testdaten benötigt die sich noch nicht in der Datenbank befinden und nicht mit “SELECT” aus der Datenbank geholt werden sollten. Eine Möglichkeit ist, Objekte zu erstellen und die Attribute mit Daten zu befüllen. Ich habe mir mit Hilfe von DBUnit noch eine weitere Möglichkeit geschaffen. Ich lese Daten aus XML, CSV … etc. mit Hilfe von DBUnit ein und schreibe sie dann nicht in die Datenbank sondern gebe sie mir als Liste in der Testmethode aus. Das im Beispiel erwähnte JsonDataSet habe ich von danhaywood aus seinem Beitrag http://danhaywood.com/2011/12/20/db-unit-testing-with-dbunit-json-hsqldb-and-junit-rules/. Das Beispiel wurde mit einer Example Klasse (https://gist.github.com/itsei/b28ec83c00dae167f1eb#file-example-java) umgesetzt und entspricht dem Objekt der Testdaten. Alle folgende Dateien sind unter https://gist.github.com/itsei/b28ec83c00dae167f1eb zu finden. Um die Daten dynamisch später laden zu können benötigen wir ein Interface (https://gist.github.com/itsei/b28ec83c00dae167f1eb#file-dataloader-java) :

import org.dbunit.dataset.DataSetException;
import org.dbunit.dataset.IDataSet;

public interface DataLoader {

public <T> T generate() throws DataSetException;

public void setData(IDataSet dataSet);

public void clean();

}

Für unsere Example Klasse benötigen wir jetzt noch die entsprechende Implementierung des Loaders, ExampleLoaderImpl.java (https://gist.github.com/itsei/b28ec83c00dae167f1eb#file-exampleloaderimpl-java). Dabei sollte je nach Attribute Type der folgende Code noch erweitert werden (teil Ausschnitt, kompletter Code siehe Link:

field = Example.class.getDeclaredField(column.getColumnName());
field.setAccessible(true);
String columnValue = (String) table.getValue(i, column.getColumnName());
if(field.getType().isAssignableFrom(Long.class)) {
field.set(example, Long.valueOf(columnValue));
} else if (field.getType().isAssignableFrom(Integer.class)) {
field.set(example, Integer.valueOf(columnValue));
} else {
field.set(example, columnValue);
}

Damit wird die Daten nun aber auch laden können, wird die Klasse DataLoaderStatement benötigt (https://gist.github.com/itsei/b28ec83c00dae167f1eb#file-dataloaderstatement-java). Diese Klasse wird später als Rule eingebunden und die Dateien mit den Testdaten mit den Annotationen angeben. Der folgende Code zeigt exemplarisch das Laden einer XML Datei (für den Rest siehe Link):

DataLoaderXml xmlData = method.getAnnotation(DataLoaderXml.class);
if(xmlData != null) {
FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder();
InputStream inputStream = resourceBase.getResourceAsStream(xmlData.value());
loader.setData(builder.build(inputStream));
}

Die CSV Implementierung kann durch kopieren des JsonDataSets einfach realisiert werden. Dazu muss einfach nur die getTable Methode angepasst werden:

public List getTables(InputStream csvStream, String tableName) {
List tables = new ArrayList();
try {
// get the base object tree from the JSON stream
Reader reader = new InputStreamReader(csvStream);

    CSVReader<String\[\]> csvParser = CSVReaderBuilder.newDefaultReader(reader);
    List<String\[\]> datas = csvParser.readAll();
    //FirsrRow title
    Map<Long,String> headline = new HashMap<Long, String>();
    List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
    if(datas != null && !datas.isEmpty()) {
        String\[\] data =  datas.get(0);
        if(data != null) {
        for (int index = 0; index < data.length; index++) {
            String dataContent = data\[index\];
            headline.put(Long.valueOf(index), dataContent);
        }
        }
    }
    for (int index = 1; index < datas.size(); index++) {
        String\[\] data = datas.get(index);
        Map<String,Object> dataMap = new HashMap<String, Object>();
        for (int ii = 0; ii < data.length; ii++) {
        String dataContent = data\[ii\];
        dataMap.put(headline.get(Long.valueOf(ii)), dataContent);
        }
        rows.add(dataMap);
    }
    ITableMetaData meta = getMetaData(tableName, rows);

    // iterate over the tables in the object tree
    DefaultTable table = new DefaultTable(meta);
    int rowIndex = 0;
    // iterate through the rows and fill the table
    for (Map<String, Object> row : rows) {
        fillRow(table, row, rowIndex++);
    }
    // add the table to the list of DBUnit tables
    tables.add(table);

    } catch (IOException e) {
    throw new RuntimeException(e.getMessage(), e);
    }
    return tables;
}

Die Einbindung in einen JUnit Test sieht dann wie folgt aus (https://gist.github.com/itsei/b28ec83c00dae167f1eb#file-exampletest-java) :

@DataLoaderXml(“sampleTestData.xml”)
@DataLoaderCsv(“sampleTestData.csv”)
public void checkValues() throws MalformedURLException, DataSetException {
List datas = (List) dataLoader.getData();
assertEquals(datas.get(0).getName(), “example”);
assertEquals(datas.get(0).getVersion(), Long.valueOf(0L));
}

Maven Dependencies:


org.dbunit
dbunit
2.4.9
jar
test


junit
junit
4.11
test


commons-collections
commons-collections
3.2.1

For english: How you can load data from files for tests? I have write an example to load data as array list in test cases. You can find all files under https://gist.github.com/itsei/b28ec83c00dae167f1eb.

HTTP Server in Eclipse einbinden

Um in Eclipse auch Statische Web Projekte auf einem Server auszurollen, wird ein HTTP Server benötigt. Diesen muss man auf seinem Rechner installieren (z.B Xampp oder Apache direkt oder einen anderen Webserver). Dann in Eclipse unter Servers auf “New” und Basic >> HTTP Server. Dann den Schritten folgen und den DocumentRoot des Webservers angeben. Danach den Webserver außerhalb von Eclipse starten und das Projekt über den Http Server in Eclipse publizieren. Dann kann man über localhost/Projektname/Filename die Seiten aufrufen. Damit Änderungen automatisch publiziert werden muss man per doppel klick auf HTTP Server unter Publishing “Automatically publish when resources change” einstellen und die Zeit auf 4 Sekunden.