http安全性hasRole()方法如何工作

时间:2015-07-18 02:55:35

标签: http spring-security http-headers authorization spring-session

我在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是一回事吗?

1 个答案:

答案 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")

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