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

浙公网安备 33010602011771号