Spring Security使用方法注解概要
前文概要:
《基于资源的认证和授权》
前文使用的资源定义方式都是基于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注解,而且首推基于资源进行设置。