zoukankan      html  css  js  c++  java
  • springsecurity授权

    一、权限表达式

    表达式描述
    permitAll() 总是返回true,表示允许所有访问(认证不认证都可访问 URL或方法)
    denyAll() 总是返回false,表示拒绝所有访问(永远访问不到指定的 URL或方法)
    isAnonymous() 当前用户是一个匿名用户(未登录用户)允许访问,返回true
    isRememberMe() 当前用户是通过Remember-Me自动登录的允许访问,返回true
    isAuthenticated() 当前用户是已经登录认证成功的允许访问(包含了rememberMe自动登录的),返回true
    isFullyAuthenticated() 如果当前用户既不是一个匿名用户,同时也不是通过Remember-Me自动登录的,则允许访问(可以理解为通过页面输入帐户信息认证的)。
    hasRole(String role) 当前用户拥有指定角色权限的允许访问,返回true。注意: 指定的角色名(如: ADMIN ) SpringSecurity 底层会在前面拼接 ROLE_ 字符串,所以在UserDetailsService实现类,数据库返回的角色名要有ROLE_ADMIN
    hasAnyRole([role1, role2]) 多个角色以逗号分隔的字符串。如果当前用户拥有指定角色中的任意一个则允许访问,返回true。
    hasAuthority(String authority) 当前用户拥有指定权限标识的允许访问,返回true。注意:和 hasRole区别是, hasAuthority 不会在前面拼接 ROLE_ 字符串, 。
    hasAnyAuthority([auth1,auth2]) 多个权限标识是以逗号分隔的字符串。如果当前用户拥有指定权限标识中的任意一个则允许访问,返回true
    hasIpAddress("192.168.1.1/29") 限制指定IP或指定范围内的IP才可以访问

      示例:

    config
        .and().authorizeRequests()
        .antMatchers("/static").permitAll()
        .antMatchers("/user").hasAnyAuthority("sys:user", "sys:auth")
        .antMatchers("/role").hasAnyRole("ADMIN", "ROOT")
        .antMatchers(HttpMethod.GET, "/auth")
        .access("hasAuthority('sys:user') or hasRole('ADMIN')")
        .anyRequest().authenticated()
    
    service
        new User(username, password,
            AuthorityUtils.commaSeparatedStringToAuthorityList("sys:user,sys:auth,ROLE_ADMIN,ROLE_ROOT"))

    二、基于注解控制方法级权限

    1、开启方法级权限控制(SpringSecurityConfig)

    @EnableGlobalMethodSecurity(prePostEnabled = true)

    2、注解

    注解描述
    @PreAuthorize(表达式) 在方法调用前进行权限检查,表达式为true允许调用,反之则无权限调用
    @PostAuthorize(表达式) 在方法调用后进行权限检查,如果表达式计算结果为false,抛出异常403不允许访问。returnObject代表方法的返回值,可以使用returnObject对方法返回值进行验证
    @PreFilter(表达式) 允许方法调用,但必须在进入方法之前过滤方法参数值。
    @PostFilter(表达式) 允许方法调用,但必须按照表达式来过滤方法的返回值。returnObject代表方法的返回值,可以使用returnObject对方法返回值进行验证

      示例:

    @PreAuthorize("hasRole('ADMIN')")
    @RequestMapping("/preAuthorize")
    @ResponseBody
    public Msg preAuthorize() {
        return Msg.success();
    }
    
    @PostAuthorize("returnObject.code == 200")
    @RequestMapping("/postAuthorize")
    @ResponseBody
    public Msg postAuthorize() {
        return Msg.success();
    }
    
    // 过滤请求参数:filterTarget 指定哪个参数,filterObject是集合中的每个元素,
    // 如果value表达式为true的数据则不会被过滤,否则 就过滤掉
    @PreFilter(filterTarget = "list", value = "filterObject > 1")
    @RequestMapping("/preFilter/{list}")// /preFilter/1,2,3
    @ResponseBody
    public Msg preFilter(@PathVariable List<Integer> list) {
        return Msg.success().add("list", list);
    }
    
    // 过滤返回值:filterObject是返回值集合中的每一个元素,当表达式为true则对应元素会返回
    @PostFilter("filterObject > 1")
    @RequestMapping("/postFilter")
    @ResponseBody
    public Object postFilter() {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        return list;
    }

    备注:

      1、注解方式可以控制controller层和service层,配置方式只可以控制controller层

  • 相关阅读:
    二部图(二分图判定--dfs)
    chd校内选拔赛题目+题解
    敌兵布阵 线段树单点更新
    Employment Planning DP
    Tickets 基础DP
    Super Jumping! Jumping! Jumping! 基础DP
    【高精度加法】
    【最短路径之dijkstra(迪杰斯特拉)算法】
    各类最短路算法基本模板-C++
    【最小生成树之Prim算法】-C++
  • 原文地址:https://www.cnblogs.com/linding/p/14028436.html
Copyright © 2011-2022 走看看