前文概要:
前文使用的资源定义方式都是基于Web的方式,即在WebSecurityConfigurerAdapter
中进行配置的,好处就是对代码没有侵入,我们无需在每个Controller的方法上去加上注解。但是缺点也很明显,万一需要对很多单个的URL进行权限配置,那么该类中就会有很多配置代码,会显得臃肿。
所以Spring Security还提供了方法注解的方式来对资源进行权限的定义。如果要开启方法注解,那么就需要改造我们的WebSecurityConfigurerAdapter
类,对需要的注解种类设置开启。
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class MyDBSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserService userService;
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService);
}
/**
* 默认开启密码加密,前端传入的密码Security会在加密后和数据库中的密文进行比对,一致的话就登录成功
* 所以必须提供一个加密对象
* @return
*/
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
以上三种注解的开关默认都是关闭的,所以需要使用者指定哪一种的需要开启。同时由于我们使用方法注解来完成资源权限的定义,所以原先基于Web方式的资源权限定义代码就不需要了,已经删除。
一、JSR-250注解
JSR(Java Specification Request)是一种Java中注解的规范,比如JSR-175、JSR-250、JSR-330。其中JSR-250是针对资源权限的注解规范,比如@Bean、@Resource、@PostConstruct、@PreDestroy等,这些注解都在Spring中得到了实现。
较常使用的注解有:
- @DenyAll,拒绝所有角色对该资源的访问;
- @PermitAll,允许所有角色对该资源的访问;
- @RolesAllowed,允许指定的角色对该资源的访问;
我们给个实际的案例看下:
@RestController
public class MyUserController {
@GetMapping("/addUser2")
@RolesAllowed({"admin"})
public String addUser2() {
return "add user success!";
}
@GetMapping("/deleteUser2")
// 角色可以省略ROLE_前缀,也可以不省略,效果一样
@RolesAllowed({"admin", "manager"})
public String deleteUser2() {
return "delete user success!";
}
}
在实际开发中,比较推荐使用prePostEnabled注解,不太常用JSR-250注解,其只支持基于角色,不能支持基于资源。
二、securedEnabled注解
@Secured
注解也是只能支持基于角色的访问控制,而且必须要加上ROLE_
前缀。
@RestController
public class MyUserController {
@GetMapping("/addUser3")
@Secured({"ROLE_admin"})
public String addUser3() {
return "add user success!";
}
@GetMapping("/deleteUser3")
@Secured({"ROLE_admin", "ROLE_manager"})
public String deleteUser3() {
return "delete user success!";
}
}
在实际开发中,比较推荐使用prePostEnabled注解,不太常用securedEnabled注解。
三、prePostEnabled注解
prePostEnabled注解是可以同时支持基于角色和基于资源的访问控制的。
@RestController
public class MyUserController {
@GetMapping("/addUser4")
@PreAuthorize("hasAuthority('user:add')")
public String addUser4() {
return "add user success!";
}
@GetMapping("/deleteUser4")
@PreAuthorize("hasAuthority('user:delete')")
public String deleteUser4() {
return "delete user success!";
}
@GetMapping("/addUser5")
@PreAuthorize("hasRole('admin')")
public String addUser5() {
return "add user success!";
}
@GetMapping("/deleteUser5")
@PreAuthorize("hasRole('admin') or hasRole('manager')")
public String deleteUser5() {
return "delete user success!";
}
}
在实际开发中,比较推荐使用prePostEnabled注解,而且首推基于资源进行设置。
网友评论