当前位置: 首页 > 知识库问答 >
问题:

Spring云安全中具有权限的用户的访问被拒绝

严子默
2023-03-14

我正在使用Spring Cloud oauth-2和Spring Cloud Security构建用户身份验证系统。我想有许多可以分配给用户组的权限。权限存储为枚举常量,如下所示:

public enum Authority {
    READ_USER(1, "View users and their details", "READ_USER"),
    WRITE_USER(2, "Create, Edit and Delete users and their details", "WRITE_USER"),
    // More authorities will be added
    ;

    Authority(int id, String description, String name) {
        this.id = id;
        this.description = description;
        this.name = name;
    }

    private final int id;
    private final String description;
    private final String name;

    public int getId() {
        return id;
    }

    public String getDescription() {
        return description;
    }

    public String getName() {
        return name;
    }
}

我已经将身份验证服务器设置为向内存中的客户端发出JWT令牌。(我认为)一切都很好。

下面是我的用户详细信息实现

public class AuthPrincipal implements UserDetails {
    private String email;
    private String password;
    private Collection<? extends GrantedAuthority> authoritySet;

    public AuthPrincipal(User user) {
        this.email = user.getEmail();
        this.password = user.getPassword();
        this.authoritySet = user.getGroup().getAuthorities().stream().map(authority -> new SimpleGrantedAuthority(authority.getName())).collect(Collectors.toList());
    }

// Necessary getters

}

就像我说的,身份验证服务器正在颁发令牌。我面临的问题是授权。以下是我的资源服务器超文本传输协议配置:


@Configuration
@EnableWebSecurity()
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {


    @Override
    public void configure(HttpSecurity http) throws Exception{
        http
                .authorizeRequests()
                .antMatchers("/").permitAll()


                // Users paths
                .antMatchers(HttpMethod.GET, "/users/**").hasAuthority(Authority.READ_USER.getName())
                .antMatchers(HttpMethod.POST, "/users/**").hasAuthority(Authority.WRITE_USER.getName())
                .antMatchers(HttpMethod.PUT, "/users/**").hasAuthority(Authority.WRITE_USER.getName())
                .antMatchers(HttpMethod.DELETE, "/users/**").hasAuthority(Authority.WRITE_USER.getName())
                .anyRequest().authenticated();
    }


}

成功身份验证后,我收到具有所需权限的用户的403访问被拒绝错误,如下面的安全调试日志所示:

2021-11-29 14:34:42.567 DEBUG 9832 --- [nio-8080-exec-3] o.s.security.web.FilterChainProxy        : Securing GET /users
2021-11-29 14:34:42.567 DEBUG 9832 --- [nio-8080-exec-3] s.s.w.c.SecurityContextPersistenceFilter : Set SecurityContextHolder to empty SecurityContext
2021-11-29 14:34:42.591 DEBUG 9832 --- [nio-8080-exec-3] p.a.OAuth2AuthenticationProcessingFilter : Authentication success: OAuth2Authentication [Principal=superuser@email.com, Credentials=[PROTECTED], Authenticated=true, Details=remoteAddress=0:0:0:0:0:0:0:1, tokenType=BearertokenValue=<TOKEN>, Granted Authorities=[{authority=READ_USER}, {authority=WRITE_USER}]]
2021-11-29 14:34:42.595 DEBUG 9832 --- [nio-8080-exec-3] o.s.s.w.a.i.FilterSecurityInterceptor    : Failed to authorize filter invocation [GET /users] with attributes [#oauth2.throwOnError(hasAuthority('READ_USER'))]
2021-11-29 14:34:42.604 DEBUG 9832 --- [nio-8080-exec-3] s.s.o.p.e.DefaultOAuth2ExceptionRenderer : Written [error="access_denied", error_description="Access is denied"] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@4cd51cd5]
2021-11-29 14:34:42.604 DEBUG 9832 --- [nio-8080-exec-3] s.s.w.c.SecurityContextPersistenceFilter : Cleared SecurityContextHolder to complete request

从日志中可以看出,用户拥有“READ_USERS”权限,但GET请求仍然被拒绝。我错过了什么?

@Entity
public class User extends BaseEntity{
    @Id
    private UUID id = UUID.randomUUID();
    @NotNull(message = "First Name cannot be blank")
    private String firstName;
    @NotNull(message = "Last Name cannot be blank")
    private String lastName;
    private String middleName;
    @NotNull(message = "Email cannot be blank")
    @Column(unique = true)
    private String email;
    private String phoneNumber;
    @JsonIgnore
    private String password;
    private String imageUrl;
    @ManyToOne
    private UserGroup group;

// Constructors, Getters and Setters
}

和用户组

@Entity
public class UserGroup extends BaseEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    @ElementCollection(fetch = FetchType.EAGER)
    @Enumerated(EnumType.STRING)
    private Set<Authority> authorities = new HashSet<>();

// Getters and setters
}

共有1个答案

甄阿苏
2023-03-14

检查这两点:-

>

在实现用户详细信息的AuthPrincipal中,确保在-

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    return this.authoritySet;
}
 类似资料:
  • 问题内容: 我不断收到此错误。 我正在使用mySQL Workbench,从中发现根的架构特权为空。根本没有特权。 我在使用服务器的平台上遇到了麻烦,这是一个突然的问题。 root@127.0.0.1 显然具有很多访问权限,但我已以此身份登录,但无论如何它只是分配给localhost-本地主机没有特权。 我做了一些类似,,等等的事情,但是从那儿或互联网上都没有找到成功。 如何获得根对其访问的权限?

  • 这个错误真的很奇怪,我不知道如何重现它,也不知道如何修复它,因为我做了很多搜索,但没有什么有用的。 这是stacktrace: 这是我的AndroidManifest。xml 请不要费心问我是否在我的清单中有正确的INTERNET权限,因为这个应用程序已经上市2年了:P 我还注意到(来自Crittercism)所有错误都来自Android 4.1. x版本(JB)。我不知道设备是否已root或什么

  • 我正在尝试使用Spring Boot RSocket与安全使用JWT令牌。它给我一个拒绝访问的错误,没有其他有用的信息来帮助调试? 拒绝访问 ApplicationErrorException(0x201):app//io.rsocket.exceptions.exceptions.from(exceptions.java:76)处的app//io-rsocket.core.RSocketRequ

  • 所以,我正在尝试将一些文件推送到我已经植根的、与ADB连接的android设备(中兴通讯)上的/system, 亚行重新装车- (但是在shell中,我不能将文件从我的计算机复制到设备) 需要帮忙吗

  • 问题内容: 概要 我试图在Docker中挂载主机目录,但是即使访问权限看起来不错,也无法从容器中访问主机目录。 细节 我在做 接着 它给了我: 以及更多类似的内容(我认为这是相关的部分)。 如果我做 结果是 主机是Fedora 20,带有Docker 1.0.0和go1.2.2。 怎么了? 问题答案: 这是SELinux问题。 您可以暂时签发 在主机上访问或通过运行添加SELinux规则 特别: