私はSpringBootアプリケーションを構築しています。Authenticated Spring Userを手動で設定する
私は春のセキュリティを使用して、そしてUserDetailsServiceの実装を設定しているのです:
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アプリケーションとのインタフェースかわからない、またはそれは別のコンテキストで使用されている場合、完全に
[SpringbootセキュリティhasRoleが動作しない]の可能な複製(http://stackoverflow.com/questions/41946473/springboot-security-hasrole-not-working) – dur