Java-Security(七):Spring Security方法注解认证启用
@EnableGlobalMethodSecurity标记启用方法认证注解类型包含以下3种:
prePostEnabled
: 确定 前置注解[@PreAuthorize,@PostAuthorize,..]
是否启用
方法注解类型一把通过@EnableGlobalMethodSecurity(prePostEnabled = true)设置,一般在MySecurityConfig类上添加@EnableGlobalMethodSecurity(prePostEnabled = true)注解并通过参数指定启用哪些方法认证注解。
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled=true) public class WebSecurityConfig extends WebSecurityConfigurerAdapter { }
支持启用多个注解
一个程序启用多个类型注解:
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)) public class WebSecurityConfig extends WebSecurityConfigurerAdapter { ... }
但是只应该设置一个注解对于行为类的接口或者类
public interface UserService { List<User> findAllUsers(); @PreAuthorize("hasAnyRole('user')") void updateUser(User user); // 下面不能设置两个注解,如果设置两个,只有其中一个生效 // @PreAuthorize("hasAnyRole('user')") @Secured({ "ROLE_user", "ROLE_admin" }) void deleteUser(); }
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class WebSecurityConfig extends WebSecurityConfigurerAdapter { ... }
// 只能user角色可以访问 @PreAuthorize ("hasAnyRole('user')") // user 角色或者 admin 角色都可访问 @PreAuthorize ("hasAnyRole('user') or hasAnyRole('admin')") // 同时拥有 user 和 admin 角色才能访问 @PreAuthorize ("hasAnyRole('user') and hasAnyRole('admin')") // 限制只能查询 id 小于 10 的用户 @PreAuthorize("#id < 10") User findById(int id); // 只能查询自己的信息 @PreAuthorize("principal.username.equals(#username)") User find(String username); // 限制只能新增用户名称为abc的用户 @PreAuthorize("#user.name.equals('abc')") void add(User user)
// 查询到用户信息后,再验证用户名是否和登录用户名一致 @PostAuthorize("returnObject.name == authentication.name") @GetMapping("/get-user") public User getUser(String name){ return userService.getUser(name); } // 验证返回的数是否是偶数 @PostAuthorize("returnObject % 2 == 0") public Integer test(){ // ... return id; }
// 指定过滤的参数,过滤偶数 @PreFilter(filterTarget="ids", value="filterObject%2==0") public void delete(List<Integer> ids, List<String> username)
@PostFilter("filterObject.id%2==0") public List<User> findAll(){ ... return userList; }
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(securedEnabled = true)) public class WebSecurityConfig extends WebSecurityConfigurerAdapter { ... }
在调用的接口或方法使用如下:
public interface UserService { List<User> findAllUsers(); @Secured({"ROLE_user"}) void updateUser(User user); @Secured({"ROLE_admin", "ROLE_user1"}) void deleteUser(); }
@Secured
注解是用来定义业务方法的安全配置。在需要安全[角色/权限等]的方法上指定 @Secured,并且只有那些角色/权限的用户才可以调用该方法。
@Secured
缺点(限制)就是不支持Spring EL
表达式。不够灵活。并且指定的角色必须以ROLE_
开头,不可省略。
在上面的例子中,updateUser
方法只能被拥有user
权限的用户调用。deleteUser
方法只能够被拥有admin
或者user1
权限的用户调用。而如果想要指定"AND"
条件,即调用deleteUser
方法需同时拥有ADMIN
和DBA
角色的用户,@Secured
便不能实现。
这时就需要使用prePostEnabled
提供的注解@PreAuthorize/@PostAuthorize
jsr250Enabled注解比较简单,只有
-
@DenyAll
: 拒绝所有访问 -
@RolesAllowed({"USER", "ADMIN"})
: 该方法只要具有"USER"
,"ADMIN"
任意一种权限就可以访问。这里可以省略前缀ROLE_
,实际的权限可能是ROLE_ADMIN
-
@PermitAll
: 允许所有访问
基础才是编程人员应该深入研究的问题,比如:
1)List/Set/Map内部组成原理|区别
2)mysql索引存储结构&如何调优/b-tree特点、计算复杂度及影响复杂度的因素。。。
3)JVM运行组成与原理及调优
4)Java类加载器运行原理
5)Java中GC过程原理|使用的回收算法原理
6)Redis中hash一致性实现及与hash其他区别
7)Java多线程、线程池开发、管理Lock与Synchroined区别
8)Spring IOC/AOP 原理;加载过程的。。。
【+加关注】。