spring-security

spring-security 的用户认证

  1. 内存中的用户
  2. JDBC中的用户
  3. 通用的用户
    自定义实现UserDetailsService接口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    //import org.springframework.security.core.userdetails.UserDetails;
    public UserDetails loadUserByUsername(final String name) {
    log.debug("Authenticating {}", name);
    String lowercaseName = name;//.toLowerCase();
    Optional<User> userFromDatabase = Optional.ofNullable(userMapper.findOneByUserNameAndStatus(lowercaseName,"1"));
    return userFromDatabase.map(user -> {
    if ("0".equals(user.getStatus())) {
    throw new UserNotActivatedException("User " + lowercaseName + " was not activated");
    }
    List<GrantedAuthority> grantedAuthorities = user.getAuthorities().stream()
    .map(authority -> new SimpleGrantedAuthority(authority.getName()))
    .collect(Collectors.toList());
    System.out.println(lowercaseName+user.getPassword()+grantedAuthorities);
    TokenUser tokenUser = new TokenUser(lowercaseName, user.getPassword(), grantedAuthorities);
    tokenUser.setUserId(user.getId());
    tokenUser.setUser(user);
    return tokenUser;
    // return new org.springframework.security.core.userdetails.User(lowercaseName,
    // user.getPassword(),
    // grantedAuthorities);
    }).orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseName + " was not found in the " +
    "database"));
    }

认证过程

  1. 用户使用用户名和密码进行登录。
  2. Spring Security 将获取到的用户名和密码封装成一个实现了 Authentication 接口的 UsernamePasswordAuthenticationToken。
  3. 将上述产生的 token 对象传递给 AuthenticationManager 进行登录认证。
  4. AuthenticationManager 认证成功后将会返回一个封装了用户权限等信息的 Authentication 对象。
  5. 通过调用 SecurityContextHolder.getContext().setAuthentication(…) 将 AuthenticationManager 返回的 Authentication 对象赋予给当前的 SecurityContext。