package com.mindskip.xzs.configuration.spring.security; import com.mindskip.xzs.domain.enums.RoleEnum; import com.mindskip.xzs.domain.enums.UserStatusEnum; import com.mindskip.xzs.service.AuthenticationService; import com.mindskip.xzs.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.LockedException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Component; import java.util.ArrayList; /** * @version 2.2.0 * @description: 登录用户名密码验证 * Copyright (C), 2020-2021, 武汉思维跳跃科技有限公司 * @date 2021 /9/7 9:45 */ @Component public class RestAuthenticationProvider implements AuthenticationProvider { private final AuthenticationService authenticationService; private final UserService userService; @Autowired public RestAuthenticationProvider(AuthenticationService authenticationService, UserService userService) { this.authenticationService = authenticationService; this.userService = userService; } @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { String username = authentication.getName(); String password = (String) authentication.getCredentials(); com.mindskip.xzs.domain.User user = userService.getUserByUserName(username); if (user == null) { throw new UsernameNotFoundException("用户名或密码错误"); } boolean result = authenticationService.authUser(user, username, password); if (!result) { throw new BadCredentialsException("用户名或密码错误"); } UserStatusEnum userStatusEnum = UserStatusEnum.fromCode(user.getStatus()); if (UserStatusEnum.Disable == userStatusEnum) { throw new LockedException("用户被禁用"); } ArrayList grantedAuthorities = new ArrayList<>(); grantedAuthorities.add(new SimpleGrantedAuthority(RoleEnum.fromCode(user.getRole()).getRoleName())); User authUser = new User(user.getUserName(), user.getPassword(), grantedAuthorities); return new UsernamePasswordAuthenticationToken(authUser, authUser.getPassword(), authUser.getAuthorities()); } @Override public boolean supports(Class aClass) { return true; } }