03.基于Method安全表达式

基于Method安全表达式

针对方法级别的访问控制比较复杂, spring security 提供了4种注解分别是
@PreAuthorize , @PostAuthorize ,@PreFilter , @PostFilter。
1)开启方法级别的注解配置
在security配置类中添加注解

/**
* Security配置类
*/
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)//开启注解支持
public class SecurityConfiguration extends WebSecurityConfigurerAdapter

在方法上使用注解
@PreAuthorize :

注解适合进入方法前的权限验证

/**
* 查询所有用户
*
* @return
*/
@RequestMapping("/findAll")
@PreAuthorize("hasRole('ADMIN')")//需要ADMIN权限
public String findAll(Model model) {
    List<User> userList = userService.list();
    model.addAttribute("userList", userList);
    return "user_list";
}

/**
* 用户修改页面跳转
*
* @return
*/
@RequestMapping("/update/{id}")
@PreAuthorize("#id<10")//针对参数权限限定 id<10可以访问
public String update(@PathVariable Integer id, Model model) {
    User user = userService.getById(id);
    model.addAttribute("user", user);
    return "user_update";
}

@PostAuthorize

    /**
     * 根据用户ID查询用户
     *
     * @return
     */
    @GetMapping("/{id}")
    @ResponseBody
    @PostAuthorize("returnObject.username==authentication.principal.username")//returnObject返回参数 只能查询自己的信息
    public User getById(@PathVariable Integer id) {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        //如果返回true,代表这个登录认证的信息来源于自动登录
        if(RememberMeAuthenticationToken.class.isAssignableFrom(authentication.getClass())){
            throw new RememberMeAuthenticationException("认证来源于remember me");
        }
        User user = userService.getById(id);
        return user;
    }

@PreFilter

    /**
     * 用户删除-多选删除
     *
     * @return
     */
    @GetMapping("/delByIds")
    @PreFilter(filterTarget = "ids",value = "filterObject%2==0")//剔除参数为基数的值 只保留偶数
    public String delByIds(@RequestParam(value = "id") List<Integer> ids) {
        for (Integer id : ids) {
            System.out.println(id);
        }
        return "redirect:/user/findAll";
    }

http://localhost:8080/user/delByIds?id=5&id=16

@PostFilter

    /**
     * 查询所有用户-返回json数据
     *
     * @return
     */
    @RequestMapping("/findAllTOJson")
    @ResponseBody
    @PostFilter("filterObject.id%2==0")//只返回偶数集合
    public List<User> findAllTOJson() {
        List<User> userList = userService.list();
        return userList;
    }

http://localhost:8080/user/findAllTOJson

 

posted @ 2023-03-16 15:20  __破  阅读(28)  评论(0)    收藏  举报