应用场景
使用Spring Security完成基于内存增加多个用户,不同的用户有不同的角色,不同的角色有不同的访问权限的场景
具体步骤
①. 用户以及角色的配置
②. 配置URL的访问权限
③. 配置方法对应的URL
通过以上三步即可完成该场景的功能,前两步通过扩展自定义WebSecurityConfigurerAdapter即可完成。
自定义WebSecurityConfigurerAdapter
@Configuration
public class MyWebSecurityConfig extends WebSecurityConfigurerAdapter {
// ①. 用户以及角色的配置
// 创建admin、root和zhangsan两个用户;
// admin的角色是:ADMIN 和 USER;root的角色是ADMIN 和 LEAD;
// zhangsan的角色是:USER
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin").password("123456").roles("ADMIN","USER")
.and()
.withUser("root").password("123456").roles("ADMIN","LEAD")
.and()
.withUser("zhangsan").password("123456").roles("USER");
}
// ②. 配置URL的访问权限
// 如果没有下面的配置,不同角色的访问权限是一样,所以需要进行配置
@Override
protected void configure(HttpSecurity http) throws Exception {
// 开启HttpSecurity的配置
http.authorizeRequests()
// admin/** 模式URL必须具备ADMIN角色
.antMatchers("/admin/**").hasRole("ADMIN")
// user/** 模式需要ADMIN或USER角色
.antMatchers("/user/**").access("hasAnyRole('ADMIN','USER')")
// dba/** 模式需要ADMIN和DBA角色
.antMatchers("/dba/**").access("hasRole('ADMIN') and hasRole('DBA')")
// 用户访问其它URL都必须认证通过后访问
.anyRequest().authenticated()
// 开启表单登录并配置登录接口
// formLogin() 方法表示开启表单登录,即登录页面
// loginProcessingUrl() 方法配置登录接口为"/login"。可以直接调用"/login"接口,
// 发起一个POST请求进行登录,登录参数中用户名必须为 username,密码必须为 password,
// 配置 loginProcessingUrl 接口主要是方便 Ajax 或者移动端调用登录接口。
// permitAll() 表示和登录相关的接口都不需要认证就可以访问。
.and().formLogin().loginProcessingUrl("/login").permitAll()
// 关闭csrf
.and().csrf().disable();
}
}
测试
@RestController
public class MyWebSecurityConfigController {
@GetMapping("/admin/say")
public String say1() {
return "HELLO, I'M A ADMIN.";
}
@GetMapping("/user/say")
public String say2() {
return "HELLO, I'M A USER.";
}
@GetMapping("/dba/say")
public String say3() {
return "HELLO, I'M A DBA.";
}
@GetMapping("/hello")
public String say4() {
return "HELLO, WORLD.";
}
}
①. 使用admin登录,由于该用户具有 ADMIN 和USER 这两个角色,所以登录后可以访问/admin/say 、 /user/say 和 /hello这三个接口;
②. 使用zhangsan登录,由于该用户仅有USER 这两个角色,所以登录后可以访问/user/say 和 /hello这三个接口;
URL | 用户: admin | 用户:张三 |
---|---|---|
/admin/say | √ | × |
/user/say | √ | √ |
/dba/say | × | × |
/hello | √ | √ |