• Neo4j database is a graph based database which uses node and edges to stores data. It is different from traditional database which uses tables to store data. So Userdetail Service of grails needs to be customized when using neo4j as database.

    So to use customized service, make a service in grails which implements the grail's userDetailService. Now in the custom service,

    Make a reference of GrantedAuthority as given below :

    static final GrantedAuthority NO_ROLE = new SimpleGrantedAuthority(SpringSecurityUtils.NO_ROLE)

    Make a reference of Grails Application as follows : 


    GrailsApplication grailsApplication

    Define repositories or service you want to use in this service.



    For example


    UserRepository userRepository


    Now override the method loadUserByloadUserByUsername as follows:

        public UserDetails loadUserByUsername(String username, boolean loadRoles)
                throws UsernameNotFoundException, DataAccessException {
            //Your logic goes here.


    Below is the example of overriding method.

        public UserDetails loadUserByUsername(String username, boolean loadRoles)
                throws UsernameNotFoundException, DataAccessException {
    UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            def conf = SpringSecurityUtils.securityConfig
            Neo4jTemplate neo4jTemplate = grailsApplication.mainContext.getBean("neo4jTemplate")
            GraphDatabaseService graphDatabaseService = grailsApplication.mainContext.getBean("graphDatabaseService")
            Transaction tx = graphDatabaseService.beginTx()
            def user
            def authorities
                String userClassName = conf.userLookup.userDomainClassName
                user = userRepository.findByUsername(username);
                authorities = new ArrayList<GrantedAuthority>()
                user.each {
                        SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(it.authority)
                authorities = !authorities || authorities.isEmpty() ? [NO_ROLE] : authorities
            createUserDetails user, authorities
        protected UserDetails createUserDetails(user, Collection<GrantedAuthority> authorities) {
            def conf = SpringSecurityUtils.securityConfig
            String usernamePropertyName = conf.userLookup.usernamePropertyName
            String username = user."$usernamePropertyName"
            String password = user.password
            boolean enabled = user.isEnabled
            boolean accountExpired = user.accountExpired
            boolean accountLocked = user.accountLocked
            boolean passwordExpired = user.passwordExpired
            new GrailsUser(username, password, enabled, !accountExpired, !passwordExpired,
                    !accountLocked, authorities,

    Now in resources.groovy inject the service or repositories you have used in your custom UserDetailService as given belowv:

    userDetailsService("Your custom service class name"){
           grailsApplication = ref('grailsApplication')
           userRepository = ref('userRepository')

Tags: neo4j