摘抄自知乎地址:https://zhuanlan.zhihu.com/p/146155314
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, jsr250Enabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}
securedEnabled: 确定@Secured注解是否启用 --- 安全注解
@secured注解是用来定义业务方法的安全配置。在需要安全【角色/权限】的方法上指定@Secured,并且只有那些角色/权限的用户才能调用该方法
@Secured缺点 就是不支持Spring EL表达式。不够灵活。并且指定的角色 必须以ROLE_开头,不可省略。
public interface UserService { List<User> findAllUsers(); @Secured({"ROLE_user"}) void updateUser(User user); @Secured({"ROLE_admin", "ROLE_user1"}) void deleteUser(); }
jsr250Enabled: 确定@RolesAllowed... 是否启用 --- JSR-250注解
- @DenyAll:拒绝所有访问
- @RolesAllowed({"user", "admin"}):该方法只要具有user,admin任意一种权限就可以访问,这里可以省略ROLE_,实际的权限可能是ROLE_USER
- @PermitAll:允许所有访问。
prePostEnabled: 确定 前置注解 @PreAuthorize、@PostAuthorize,...]是否启用
该注解更适合方法级的安全,也支持Spring 表达式语言,提供了基于表达式的访问控制
// 只能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)
- @PreAuthorize在方法调用之前,基于表达式的计算结果来限制对方法的访问
- @PostAuthorize允许方法调用,但如果表达式计算结果为false,将抛出一个安全性异常。
- @PostFilter 允许方法调用,但必须按照表达式来过滤方法的结果
- @PreFilter 允许方法调用,但必须在进入方法之前过滤输入值。
同一应用程序中,可以启动多个类型的注解。但是只应该设置一个注解对于行为类的接口或类