Spring Security核心概念讲解

2025-06-18
来源:
一、Authentiation和Authorization
Authentiation认证就像公司门口的保安:







//模拟用户登录(认证过程)Authentication auth = new UsernamePasswordAuthenticationToken(    "zhangsan",   //用户名    "123456",    //密码    List.of(new SimpleGrantedAuthority("ROLE_EMPLOYEE")) //权限);SecurityContextHolder.getContext().setAuthentication(auth);
  • 认证解决"你是谁"的问题

  • 常见方式: 用户名密码、OAuth2、JWT

  • 成功后生成Authentication对象


Authorization就像公司的门禁, 不是每间房间都能随便进的.




@PreAuthorize("hasRole('ADMIN')") //只有ADMIN能访问public void deleteUser(Long userId) {    //删除用户逻辑}
  • 授权解决"你能干什么"的问题

  • 通常通过注解或配置实现


二、SecurityContext和SecurityContextHolder






//获取当前用户信息(就像银行柜台查你的资料)Authentication currentAuth = SecurityContextHolder.getContext().getAuthentication();
String username = currentAuth.getName();Object principal = currentAuth.getPrincipal();Collection<? extends GrantedAuthority> authorities = currentAuth.getAuthorities();
  • 默认使用ThreadLocal存储安全上下文

  • 为什么不用Session? 为了支持RESTful无状态架构

  • 可通过策略修改存储方式: MODE_INHERITABLETHREADLOCAL


三、UserDetails和UserDetailsService
1) 自定义用户信息










public class MyUser implements UserDetails {    private String username;    private String password;    private List<GrantedAuthority> authorities;
    //必须实现的5个方法    @Override public boolean isAccountNonExpired() { return true; }    @Override public boolean isCredentialsNonExpired() { return true; }    //...其他方法}
2) 自定义用户查询服务










@Servicepublic class MyUserService implements UserDetailsService {    @Override    public UserDetails loadUserByUsername(String username) {        //这里实际应该查数据库        return new MyUser(username,                          encodePassword("123456"),                          List.of(new SimpleGrantedAuthority("USER")));    }}
四、GrantedAuthority与角色管理
权限 vs 角色的区别:








// 权限声明List<GrantedAuthority> authorities = AuthorityUtils    .createAuthorityList("ROLE_ADMIN", "user:delete");
//权限检查if (auth.getAuthorities().contains(new SimpleGrantedAuthority("user:delete"))) {    //允许删除操作}
  1. 角色前缀ROLE_是Spring的约定

  2. 推荐权限命名格式为:   资源:操作(product:read)


这是穿插一下RBAC的概念:

RBAC(Role-Based Access Control)是基于角色的访问控制, 核心思想是把权限赋予角色,再把角色赋予用户.

用户:






public class User {    private Long id;    private String username;    private Set<Role> roles; //关联角色}

角色:






public class Role {    private String code; //如:ROLE_ADMIN    private String name; //如:系统管理员    private Set<Permission> permissions;}

权限:






public class Permission {    private String resource; //如:order    private String action;   //如:delete    private String code;   //如:order:delete}

资源:









@RestController@RequestMapping("/orders")@PreAuthorize("hasAuthority('order:read')") //权限控制点public class OrderController {    @DeleteMapping    @PreAuthorize("hasAuthority('order:delete')")    public void deleteOrder() {...}}
图片


分享
下一篇:这是最后一篇
上一篇:这是第一篇
写评论...