DaoAuthenticationProvider
を使用して、スプリングセキュリティを使用して基本認証を行っています。私は私の要求を事前認証したいので、@PreAuthorize
注釈を使用しています。問題は、Spring Securityが複数のロールと権限を区別しないように見えることです。たとえば、/users
にアクセスすると、ログイン画面にプロンプトが表示されますが、どのユーザーにログインしても、表示されるすべてのユーザーのリストが表示されます。これは達成したいものではありません。私はユーザーリストへのアクセスをロール管理者に制限したいと思っています。ここでスプリングセキュリティはロールを区別しません
は私SecurityConfig
次のとおりです。ここで
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
@Resource(name = "userRestClient")
UserService userService;
@Autowired
private AuthenticationProvider authenticationProvider;
@Autowired
@Qualifier("authenticationProvider")
public void setAuthenticationProvider(AuthenticationProvider authenticationProvider) {
this.authenticationProvider = authenticationProvider;
}
@Autowired
public void configureAuthManager(AuthenticationManagerBuilder authenticationManagerBuilder) {
authenticationManagerBuilder.authenticationProvider(authenticationProvider);
}
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
authProvider.setUserDetailsService(userService);
// authProvider.setPasswordEncoder(encoder());
return authProvider;
}
@Bean
public PasswordEncoder encoder() {
return new BCryptPasswordEncoder(11);
}
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.authorizeRequests()
.antMatchers("/", "/users", "/user").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout().permitAll();
httpSecurity
.csrf().disable();
httpSecurity
.headers()
.frameOptions().disable();
}
@Bean
protected UserDetailsService userDetailsService() {
return super.userDetailsService();
}
}
は私のコントローラである:
@Controller
@Component
public class UserWebController {
private final UserRestClient userService = new UserRestClient();
@PreAuthorize("hasRole('ROLE_ADMIN')")
@RequestMapping(value = "/users", method = RequestMethod.GET)
@Produces(MediaType.APPLICATION_JSON)
public ResponseEntity<List<User>> getAllUsers() {
List<User> users = userService.findAllUsers().stream().map(UserMapper.INSTANCE::from).collect(Collectors.toList());
return new ResponseEntity<List<User>>(users, HttpStatus.OK);
}
}
UserDetails
インタフェースの私の実装:
public class MyUser implements UserDetails {
private User user;
public MyUser(User user) {
this.user = user;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Set<GrantedAuthority> roles = new HashSet<>();
roles.add(new Authority(user.getRole()));
return roles;
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getUsername();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
Userエンティティ:
@Table(name = "users")
@AllArgsConstructor
@Data
@NoArgsConstructor
@javax.persistence.Entity
public class User extends Entity implements Serializable {
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "role")
private String role;
}
は、私は、ユーザーが正しいロールに認証された場合にのみ、OK応答を取得することです。したがって、私の場合、認証されたユーザーが管理者でない場合、私はユーザーのリストを取得したくありません。 – mka
@dur申し訳ありませんが、私の最初の質問です。次回は改善を図ります。あなたの答えは解決策のようです、ありがとう! – mka