Using Customized Userdetail Service of Grails with NeoFourj Database

Posted By Rajeev Kumar | 29-Dec-2014

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:

@Override

    public UserDetails loadUserByUsername(String username, boolean loadRoles)

            throws UsernameNotFoundException, DataAccessException {

        //Your logic goes here.

    }
 

 

Below is the example of overriding method.

@Override

    public UserDetails loadUserByUsername(String username, boolean loadRoles)

            throws UsernameNotFoundException, DataAccessException {

        loadUserByUsername(username)

    }

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

        try{

            String userClassName = conf.userLookup.userDomainClassName

            user = userRepository.findByUsername(username);

            authorities = new ArrayList<GrantedAuthority>()

            user.each {

                it.role.each{

                    SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(it.authority)

                    authorities.add(simpleGrantedAuthority);

                }

            }

            authorities = !authorities || authorities.isEmpty() ? [NO_ROLE] : authorities

        }finally{

            tx.success()

            tx.finish()

        }

        

        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, user.id)

    }

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')

   }
Request for Proposal

Recaptcha is required.

Sending message..