Spring Security权限配置

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) 注解

猜你喜欢

转载自blog.csdn.net/magicproblem/article/details/112613182