Skip to content
Don't expose your database IDs on front end.
Java
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
obfuscatedids-core
obfuscatedids-examples-spring
obfuscatedids-hashid
obfuscatedids-spring
.codeclimate.yml
.gitignore
.travis.yml
LICENSE
README.md
logo.png
pom.xml

README.md

Build status on https://travis-ci.com/ Codacy Badge

Obfuscated-IDs

Undisclose IDs with Obfuscated-IDs

Obfuscated-IDs is a java open-source library that allows you to easily avoid to expose the internal IDs of your database at web level.

Obfuscated-IDs is based on:

Overview

With a Spring Framework and Obfuscated-IDs i's possible to write a @Controller that automatically allows the code to use the real numeric ID while it is always shown in its disguised form at the outside. For instance, look at this @RestController.

    @RestController
    public class EchoController {

        @RequestMapping("/user/{obfuscatedUserId}/{message}")
        public String getCode(@PathVariable AutoObfuscatedId obfuscatedUserId, @PathVariable String message) {
            
            long id = obfuscatedId.id();
            
            // ...access the database with the numeric id
            User user = userRepo.findOne(id);
            
            return "User " + obfuscatedId + " says '" + message + "'";
        }

    }

It exposes a service that can be invoked like that...

    /user/2BHah7n8ziI/HelloWorld

But obfuscatedId.id() will return the corresponding numeric ID.

Quick Start

Add the following Maven dependency

<dependency>
    <groupId>com.danidemi.obfuscatedids</groupId>
    <artifactId>obfuscatedids-spring</artifactId>
    <version>0.0.1</version>
</dependency>

[!] Please, check on Maven Central the latest version.

Configure an IdObfuscator.

@Bean
public static IdObfuscator idObfuscator() {
    return new HashIdObfuscator();
}

Add a @RestControllerAdvice that enables the conversion of parameters of type AutoObfuscatedId.

@RestControllerAdvice
public static class Advice {

    @Autowired IdObfuscator obfuscator;

    @InitBinder
    public void addSupportForObfuscatedId(WebDataBinder binder) {
        binder.registerCustomEditor(AutoObfuscatedId.class, new AutoObfuscatedIdSupport(obfuscator));
    }

}

Write your controller.

@Autowired @Autowired IdObfuscator obfuscator;

@RequestMapping("/users")
public List<String> getUsers() {
    return asList(
        obfuscator.disguise( user1.getId() ),
        obfuscator.disguise( user2.getId() )
    );
}

@RequestMapping("/user/{obfuscatedDbId}")
public String getUser(@PathVariable AutoObfuscatedId obfuscatedDbId) {
    ...
}

Deploy

Maven GPG Plugin

Make sure GPG is correctly set up executing the following commnad.

mvn gpg:sign

If that returns this error...

gpg: no default secret key: unusable secret key
gpg: signing failed: unusable secret key

...then A GPG key is needed. If one is available you can import it with...

gpg --import ~/mygpgkey_pub.gpg
gpg --allow-secret-key-import --import ~/mygpgkey_sec.gpg

Rerun again mvn gpg:sign to check all is in place.

Sonatype OSS Repository Hosting

Make sure the Sonatype OSS Repository Hosting is properly set up checking that the Maven's settings.xml contains a reference to it.

cat ${user.home}/.m2/settings.xml

You should see something like that...

<server>
    <id>ossrh</id>
    <username>YOUR-OSSRH-USERNAME-HERE</username>
    <password>YOUR-OSSRH-PASSWORD-HERE</password>
</server>

Deploy A New Release

To deploy it should be enough to issue the following commands.

mvn clean release:clean 
mvn release:prepare
mvn release:perform

References

Projects

Manuals

Posts

You can’t perform that action at this time.