我在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
,我会收到拒绝访问错误。
我的问题是,在@localhost之前的adminusername:adminpassword
部分:8080 .... HTTP请求的标头?
我问的原因是因为我需要创建一个能够登录的客户端,验证其凭据(用户名和密码),并将用户名和密码用作会话ID ,以便客户端在登录后进行HTTP请求调用时,用户名和密码将附加到标头并由REST API处理。
的hasRole()
http.authorizeRequests()
.antMatchers("/users/get/**", "/users/get/**").hasRole("ADMIN");
安全配置中的依赖于@localhost之前的username:password
:8080 ....这与spring rest API的@RequestHeader
是一回事吗?
答案 0 :(得分: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")
。
我希望这会回答你的问题。