2017-04-22 7 views
2

私はSpringBootアプリケーションを構築しています。Authenticated Spring Userを手動で設定する

私は春のセキュリティを使用して、そしてUserDetailsS​​erviceの実装を設定しているのです:

public class MyUserDetailService implements UserDetailsService { 

    @Autowired 
    private UserService userService; 

    @Override 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
     org.springframework.security.core.userdetails.User springUser = null; 
     User user = userService.loadUserByUsername(username); 
     if(user != null){ 
      List<SimpleGrantedAuthority> authorities = null; 
      List<Role> roles = user.getRoles(); 
      if(roles != null){ 
       authorities = new ArrayList<>(); 
       for(Role currentRole: roles){ 
        authorities.add(new SimpleGrantedAuthority(currentRole.name())); 
       } 
      } 
      springUser = new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities); 
     } 
     return springUser; 
    } 

} 

私はデータベースにユーザを追加するためのメソッドを含むサービス層があります。

public interface UserService { 

    public Long addStandardUser(String firstName, String lastName, String username, String password); 

    @PreAuthorize("hasRole('ADMIN')") 
    public Long addAdministratorUser(String firstName, String lastName, String username, String password); 

    @PreAuthorize("hasRole('ADMIN')") 
    public User loadUserByUsername(String username); 

    public Iterable<User> getUsers(int pageNumber, int pageSize, Direction direction, String sort); 

} 

を私も持っていますサンプルユーザーとデータベースを初期化するために(devモードで)使用するCommandLineRunnerの実装:

@Component 
@Profile("dev") 
public class DBInitializer implements CommandLineRunner { 

    @Autowired 
    private UserService userService; 

    @Override 
    public void run(String... args) throws Exception { 
     List<SimpleGrantedAuthority> authorities = new ArrayList<>(); 
     authorities.add(new SimpleGrantedAuthority("ADMIN")); 
     Authentication authentication = new UsernamePasswordAuthenticationToken("foo", null, authorities); 
     SecurityContextHolder.getContext().setAuthentication(authentication); 
     userService.addAdministratorUser("John", "Doe", "jdoe", "1234"); 
     System.out.println("done!"); 
    } 
} 

問題は、ユーザーを追加しようとすると、CommandLineRunnerのSpringからAccess Denied例外が発生していることです。私は問題は私が手動でSpring Userを間違って "注入"していると仮定しています。 addAdminUser()メソッドはADMINロールのユーザーによって実行される必要があるため、ADMINユーザーとして一時的に実行する必要があります。私は、他のJ2EEアプリケーションで使用して覚えて@RunAs注釈があるけど、私はそれがSpringアプリケーションとのインタフェースかわからない、またはそれは別のコンテキストで使用されている場合、完全に

+0

[SpringbootセキュリティhasRoleが動作しない]の可能な複製(http://stackoverflow.com/questions/41946473/springboot-security-hasrole-not-working) – dur

答えて

1
... 
// The default role prefix starts with `ROLE_` 
authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN")); 
... 

もっと詳しく参照してくださいhere

関連する問題