2010-09-23 8 views
2

Je veux écrire Authorization a utilisé le Spring Security. Les données des utilisateurs seront sauvegardées dans le divchDB. J'ai un problème avec l'accès possible aux méthodes.Spring Security - CouchDB

@PreAuthorize("hasAuthority('ROLE_ADMIN')") 
    @Transactional 
    public void deleteDriver(Driver driver) { 
     dataService.deleteDrivers(driver); 
    }.. 

Cette annotation @PreAuthorize n'a pas fonctionné. J'ai écrit:

<global-method-security secured-annotations="enabled" pre-post-annotations="enabled" jsr250-annotations="enabled"> 

dans Aplication-contexte security.xml

+0

Pouvez-vous s'il vous plait reformuler? Je trouve plutôt difficile de voir ce qui est demandé. –

+0

Un bon tutoriel pour implémenter Spring Security Core à CouchDB? –

+1

@ code4jhon si vous en avez encore besoin, je réponds à la question et cela pourrait aider :) – gonzalon

Répondre

0

Je parie que vous résoudre déjà votre problème, mais peut-être cela peut aider quelqu'un d'autre ...

1- Configuration du app

Vous devez ajouter votre propre implémentation de UserDetailsService.

public class AppConfig extends WebMvcAutoConfiguration { 
... 
    @Bean 
    public UserSecurityService userSecurityService() { 
     return new UserSecurityService(); 
    } 
... 
} 

2- entité utilisateur

public class CustomUserDetail extends org.springframework.security.core.userdetails.User { 

    public CustomUserDetail(String username, String password, Collection<? extends GrantedAuthority> authorities) { 
     super(username, password, authorities); 
    } 
} 

3- UserRepository

@Component 
public class UserRepository extends CouchDbRepositorySupport<User> { 
     ... 
     @View(name = "findUserByUsername", map = "function(doc) { if (doc.docType == 'User') emit(doc.username, doc._id) }") 
     public User findUserByUsername(String username) { 
      return queryViewReturnSingleEntity("findUserByUsername",username);   
     } 
     ... 
} 

4- Mise en oeuvre de UserDetailsService, UserSecurityService

public class UserSecurityService implements UserDetailsService { 

    @Autowired 
    private UserRepository userRepo; 

    @Override 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException 
    { 
     //Spring user 
     UserDetails userDetails = null; 

     //CouchDB Object 
     User user = userRepo.getByUsername(username); 

     List<GrantedAuthority> grantedAuths = new ArrayList<GrantedAuthority>(); 
     String rol = user.getRol(); 
     grantedAuths.add(new SimpleGrantedAuthority(rol)); 

     if(user != null){ 
      //Spring user implementation 
      userDetails = new CustomUserDetail(user.getUsername(), user.getPassword(), grantedAuths); 
     } 

     if (userDetails == null) { 
      throw new UsernameNotFoundException("User not found"); 
     } 

     return userDetails; 
    } 
} 

5- Enfin, vous devez étendre GlobalMethodSecurityConfiguration

@Configuration 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {     

    @Override 
    protected MethodSecurityExpressionHandler createExpressionHandler() { 
     DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler(); 
     return expressionHandler; 
    } 
} 

Whit tout cela maintenant, vous pouvez ajouter:

@PreAuthorize("hasRole('ROLE_SUPER_USER')") 

Pour valider l'accès en ce qui concerne le rôle de l'utilisateur.