@Secured
判断是否具有角色,另外需要注意的是这里匹配的字符串需要添加前缀ROLE_;
使用注解先要开启注解功能,在配置类或者启动类,一般在启动类上
@MapperScan({"net.master.security.app.masterspringsecurity.dao"})
@SpringBootApplication
@EnableGlobalMethodSecurity(securedEnabled=true)
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
访问控制:
@GetMapping("update")
@Secured({"ROLE_role","ROLE_manager"})
public String update(){
return "hello update ----" + new Date();
}
角色:
List<GrantedAuthority> authorities = AuthorityUtils.commaSeparatedStringToAuthorityList("admins,ROLE_sale");
配置:
//当前登录用户,只要具备其中一个角色就可以访问这个路径
.antMatchers("/test/index").hasAnyRole("sale","role")
测试:当前的权限设置,允许访问/test/index,但不允许访问/test/update
权限调整,测试:update允许访问
List<GrantedAuthority> authorities = AuthorityUtils.commaSeparatedStringToAuthorityList("admins,ROLE_sale,ROLE_manager");
@PreAuthorize
开启注解:
@EnableGlobalMethodSecurity(prePostEnabled = true)
注解适合进入方法前的权限验证,@PreAuthorize 可以将登录用户的 roles/permissions 参数传到方法中,注意外部是双引号,里面是单引号:
@GetMapping("update")
@PreAuthorize("hasAnyAuthority('admins')")
public String update(){
return "hello update ----" + new Date();
}
权限:
List<GrantedAuthority> authorities = AuthorityUtils.commaSeparatedStringToAuthorityList("admins,ROLE_sale,ROLE_manager");
测试:当前的权限设置,允许访问/test/update
@PostAuthorize
先开启注解功能:
@EnableGlobalMethodSecurity(prePostEnabled = true)
注解使用并不多,在方法执行后再进行权限验证,适合验证带有返回值的权限:
@GetMapping("update")
@PostAuthorize("hasAnyAuthority('admins')")
public String update(){
System.out.println("update ----");
return "hello update ----" + new Date();
}
权限:这里的权限和访问控制的校验是不匹配的
List<GrantedAuthority> authorities = AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_sale,ROLE_manager");
测试:当权限不匹配的情况下,update方法中的输出语句能否执行
@PostFilter
@PostFilter :权限验证之后对数据进行过滤,留下username 是admin1的数据
表达式中的 filterObject 引用的是方法返回值 List 中的某一个元素
@GetMapping("getAll")
@PostAuthorize("hasAnyAuthority('admins')")
@PostFilter("filterObject.username == 'admin1'")
public List<Users> getAll(){
List<Users> users = new ArrayList<>();
users.add(new Users(1,"admin1","666"));
users.add(new Users(2,"admin2","999"));
return users;
}
权限:
List<GrantedAuthority> authorities = AuthorityUtils.commaSeparatedStringToAuthorityList("admins,ROLE_sale,ROLE_manager");
测试:
@PreFilter
@PreFilter: 进入控制器之前对数据进行过滤
@PostMapping("save")
@PreAuthorize("hasAnyAuthority('admins')")
@PreFilter(value = "filterObject.username == 'admin1'")
public String save(@RequestBody List<Users> users){
return JSON.toJSONString(users);
}