Blog

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

Tags: neo4j