0

我在 Spring 中开发了一个 RESTful API,它从数据库 (MongoDB) 中检索用户信息并将该数据返回给使用此 REST API 的客户端。但在检索数据之前,REST API 会检查用户是否为管理员。只有管​​理员可以执行 GET 操作来检索用户信息

所以在我的 securityconfig.java 类中我有这个:

http.authorizeRequests()
            .antMatchers("/users/get/**", "/users/get/**").hasRole("ADMIN");

http.httpBasic();

现在,用户都有自己的角色,一切都按预期工作,因为当我打电话时curl adminusername:adminpassword@localhost:8080/users/get/AllUsers

我能够检索所有用户,因为用户名为 的用户adminusername是管理员并且他具有权限。但是,如果我adminusername用非管理员用户名替换,我会收到拒绝访问错误。

我的问题是,adminusername:adminpassword@localhost:8080.... 之前的部分是 HTTP 请求的标头吗?

我问的原因是因为我需要创建一个能够登录的客户端,验证他的凭据(用户名和密码),并将用户名和密码用作会话 id,以便客户端在任何时候发出 HTTP 请求登录后调用,用户名和密码附加到头部并由 REST API 处理。

hasRole() 的

http.authorizeRequests()
                .antMatchers("/users/get/**", "/users/get/**").hasRole("ADMIN");

在安全配置中依赖于username:password@localhost:8080 之前的...。这与@RequestHeaderspring rest API 是一样的吗?

4

1 回答 1

0

首先,Http Basic 是一种通过标头发送用户凭据的方式 -

var header = {'Authorization': 'Basic '+btoa(username+':'+password)} //javascript

第二件事是用户的权限。您必须在系统中创建用户,并为他们添加权限,例如:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
            .withUser("mati").password("qwerty").roles("ADMIN", "USER").and()
            .withUser("mati2").password("qwerty").roles("USER");
}

这些用户后来成为Principal具有授予权限的类的对象(如“ROLE_USER”或“ROLE_ADMIN”)。

例如,当您打电话时

curl adminusername:adminpassword@localhost:8080/users/get/AllUsers

Spring Security 将检查是否正确Principal(使用给定的用户名并检查密码是否匹配),将其加载到SecurityContext并检查是否Principal具有权限“ROLE_ADMIN”(通过hasRole("ADMIN"))。我必须补充一点,这很棘手,我不记得确切,如果你是hasRole("ADMIN")hasRole("ROLE_ADMIN").

我希望这能回答你的问题。

于 2015-07-18T14:18:46.820 回答