1、通过WebSecurityConfigurerAdapter配置类配置权限
public void configure(HttpSecurity httpSecurity) throws Exception {
// httpSecurity.exceptionHandling().accessDeniedPage("/403"); /* 配置没有权限访问条状自定义页面 */
httpSecurity.authorizeRequests() /* 指定哪些url可以访问,那些不能访问 */
.antMatchers("/test/index","/user/login").permitAll() /* 设置那些路径不需要认证可以访问 */
.antMatchers("/test/hello").hasAnyRole("manager,monitor") /* 跟具已有角色判断是否可以访问这个页面 */
// .antMatchers("/test/hello").hasRole("manager") /* 跟具已有角色判断是否可以访问这个页面 */
// .antMatchers("/test/hello").hasAnyAuthority("admin","manager") /* 只要有拥有其中一个权限即可访问这个页面 */
// .antMatchers("/test/hello").hasAuthority("admin") /* 当前用户登录只有具有admin权限才可以访问这个路径 */
.anyRequest().authenticated(); /* 所有请求都可以访问 */
}
1)、hasAnyRole(“manager,monitor”)
可以配置多个角色,只要有其中一个角色就有权限访问。
2)、hasRole(“manager”)
只能配置一个角色,跟具已有角色判断是否可以访问这个页面
注意:在配置角色时请注意要在角色前加ROLE_
3)、hasAnyAuthority(“admin”,“manager”)
可以配置多个权限,通过其中一个权限即可访问这个页面
4)、hasAuthority(“admin”)
只能配置一个权限,录只有具有该权限才可以访问这个路径
2、通过注解配置权限
@Controller
@RequestMapping("/test")
@EnableGlobalMethodSecurity(securedEnabled=true,prePostEnabled=true) /* 开启security注解 */
public class TestController {
@Secured({"ROLE_manage","ROLE_admin"}) /* 只要拥有manage或admin其中一个角色就可以使用这个方法 */
@RequestMapping("testSecured")
@ResponseBody
public String testSecured(){
System.out.println("testSecured.....");
return "testSecured ok";
}
@RequestMapping("testPreAuthorize")
@ResponseBody
@PreAuthorize("hasAnyAuthority('adminaaaa')") /* 在方法调用之前验证是否有admin权限,没有则无法调用该方法 */
public String testPreAuthorize(){
System.out.println("PreAuthorize......");
return "PreAuthorize ok";
}
@PostAuthorize("hasAnyAuthority('admin2')") /* 在方法执行后再进行权限验证,适合验证带有返回值的权限 */
@RequestMapping("testPostAuthorize")
@ResponseBody
public String testPostAuthorize(){
System.out.println("PostAuthorize......");
return "PostAuthorize ok";
}
@PreAuthorize("hasAnyAuthority('admin')")
@PostFilter("filterObject.username == 'zhansan'") /* 如果有权限满足条件则过滤响应结果 */
@ResponseBody
@RequestMapping("testPostFilter")
public List<Users> testPostFilter(){
List<Users> list = new ArrayList<>();
list.add(new Users(1,"zhansan","123"));
list.add(new Users(2,"lisi","123"));
System.out.println(list);
return list; //[{"id":1,"username":"zhansan","password":"123"}]
}
@RequestMapping("testPreFilter")
@PreAuthorize("hasAnyAuthority('admin')")
@PreFilter(value = "filterObject.id %2 == 0") /* 满足条件,对于参数数据进行过滤处理 */
@ResponseBody
public List<Users> testPreFilter(List<Users> list1){
List<Users> list2 = new ArrayList<>();
list2.add(new Users(10,"十","12345"));
list1.addAll(list2);
return list1;
}
}
1)、@Secured({“ROLE_manage”,“ROLE_admin”})
配置角色务必在角色名之前加ROLE_,只要拥有其中一个角色就可以使用这个方法
2)、@PreAuthorize(“hasAnyAuthority(‘adminaaaa’)”)
在方法调用之前验证是否满足调用配置权限的方法或者是公式,没有则无法调用该方法
3)、@PostAuthorize(“hasAnyAuthority(‘admin2’)”)
在方法执行后再进行验证是否满足调用配置权限的方法或者是公式,没有则无法返回结果跳转403页面,适合验证带有返回值的权限
5)、@PostFilter(“filterObject.username == ‘zhansan’”)
如果有权限则过滤并返回满足条件的响应结果,一般用于对集合的处理
6)、@PreFilter(value = “filterObject.id %2 == 0”)
如果有权限则过滤并传入满足条件的参数,一般用于对集合的处理
注意:使用1、2、3注解时务必在类上使用@EnableGlobalMethodSecurity(securedEnabled=true,prePostEnabled=true) 注解