Java Spring Security没有';不能区分角色

Java Spring Security没有';不能区分角色,java,spring,spring-security,Java,Spring,Spring Security,我正在使用Spring Security通过DaoAuthenticationProvider进行基本身份验证。我想预授权我的请求,所以我使用@preauthorize注释。问题在于Spring Security似乎没有区分多个角色和权限。例如,如果我访问/users,系统会提示我进入登录屏幕,但无论使用哪个用户登录,我都会显示所有用户的列表。这不是我想要实现的,我想将用户列表的访问权限限制为管理员角色 这是我的SecurityConfig: @配置 @EnableGlobalMethodSec

我正在使用Spring Security通过
DaoAuthenticationProvider
进行基本身份验证。我想预授权我的请求,所以我使用
@preauthorize
注释。问题在于Spring Security似乎没有区分多个角色和权限。例如,如果我访问
/users
,系统会提示我进入登录屏幕,但无论使用哪个用户登录,我都会显示所有用户的列表。这不是我想要实现的,我想将用户列表的访问权限限制为管理员角色

这是我的
SecurityConfig

@配置
@EnableGlobalMethodSecurity(securedEnabled=true)
@RequiredArgsConstructor(onConstructor=@u u({@Autowired}))
公共类安全配置扩展了WebSecurity配置适配器{
@自动连线
@资源(name=“userRestClient”)
用户服务用户服务;
@自动连线
私有身份验证提供者AuthenticationProvider;
@自动连线
@限定符(“authenticationProvider”)
public void setAuthenticationProvider(AuthenticationProvider AuthenticationProvider){
this.authenticationProvider=authenticationProvider;
}
@自动连线
公共无效配置AuthManager(AuthenticationManagerBuilder AuthenticationManagerBuilder){
authenticationManagerBuilder.authenticationProvider(authenticationProvider);
}
@豆子
公共DaoAuthenticationProvider authenticationProvider(){
DaoAuthenticationProvider authProvider=新的DaoAuthenticationProvider();
authProvider.setUserDetailsService(userService);
//setPasswordEncoder(encoder());
返回authProvider;
}
@豆子
公共密码编码器(){
返回新的BCryptPasswordEncoder(11);
}
@凌驾
受保护的无效配置(HttpSecurity HttpSecurity)引发异常{
httpSecurity
.授权请求()
.antMatchers(“/”、“/users”、“/user”).permitAll()
.anyRequest().authenticated()
.及()
.formLogin()
.login页面(“/login”)
.permitAll()
.及()
.logout().permitAll();
httpSecurity
.csrf().disable();
httpSecurity
.headers()
.frameOptions().disable();
}
@豆子
受保护的UserDetailsService UserDetailsService(){
返回super.userDetailsService();
}
}
这是我的控制器:

@控制器
@组成部分
公共类UserWebController{
private final UserRestClient userService=new UserRestClient();
@预授权(“hasRole('ROLE_ADMIN'))
@RequestMapping(value=“/users”,method=RequestMethod.GET)
@产生(MediaType.APPLICATION_JSON)
公众反应{
List users=userService.findAllUsers().stream().map(UserMapper.INSTANCE::from).collect(Collectors.toList());
返回新的响应属性(用户,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;
    }
}

您必须启用
@PreAuthorize
,请参阅:

确定是否应启用Spring Security的预发布批注。默认值为false

您的修改和简化配置:

@配置
@EnableGlobalMethodSecurity(Prespenabled=true,securedEnabled=true)
@RequiredArgsConstructor(onConstructor=@u u({@Autowired}))
公共类安全配置扩展了WebSecurity配置适配器{
@自动连线
@资源(name=“userRestClient”)
用户服务用户服务;
@自动连线
私有身份验证提供者AuthenticationProvider;
@自动连线
@限定符(“authenticationProvider”)
public void setAuthenticationProvider(AuthenticationProvider AuthenticationProvider){
this.authenticationProvider=authenticationProvider;
}
@自动连线
公共无效配置AuthManager(AuthenticationManagerBuilder AuthenticationManagerBuilder){
authenticationManagerBuilder.authenticationProvider(authenticationProvider);
}
@豆子
公共DaoAuthenticationProvider authenticationProvider(){
DaoAuthenticationProvider authProvider=新的DaoAuthenticationProvider();
authProvider.setUserDetailsService(userService);
返回authProvider;
}
@豆子
公共密码编码器(){
返回新的BCryptPasswordEncoder(11);
}
@凌驾
受保护的无效配置(HttpSecurity HttpSecurity)引发异常{
httpSecurity
.授权请求()
.antMatchers(“/”、“/users”、“/user”).permitAll()
.anyRequest().authenticated()
.及()
.formLogin()
.login页面(“/login”)
.permitAll()
.及()
.logout()
.permitAll()
.及()
.csrf()
.disable()
.及()
.headers()
.frameOptions().disable();
}
@豆子
受保护的UserDetailsService UserDetailsService(){
返回super.userDetailsService();
}
}

@dur我对预授权注释的理解是,只有当用户使用正确的角色进行身份验证时,我才会得到OK响应。因此,在我的情况下,如果经过身份验证的用户不是管理员,我不希望他们获得用户列表。@对不起,这是我在这里的第一个问题,下次我将尝试改进。你的答案似乎就是答案,谢谢!
@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;
}