SpringSecurity自定义用户认证逻辑
⒈处理用户信息获取逻辑
用户信息的获取逻辑是被SpringSecurity封装到UserDetailsService接口里面的
1 package org.springframework.security.core.userdetails; 2 3 /** 4 * 用户信息的获取逻辑是被SpringSecurity封装到UserDetailsService接口里面的 5 */ 6 public interface UserDetailsService { 7 8 /** 9 * 根据通过用户输入的用户名得到用户信息,SpringSecurity会利用这些用户信息去做一些相应的处理和校验。 10 * 如果处理和检验都通过了,Spring会把这个用户放到Session里面。 11 * 如果找不到用户,则会抛出用户名不存在这个异常 12 * @param username 13 * @return 14 * @throws UsernameNotFoundException 15 */ 16 UserDetails loadUserByUsername(String username) throws UsernameNotFoundException; 17 }
1 package cn.coreqi.security.services; 2 3 import org.slf4j.Logger; 4 import org.slf4j.LoggerFactory; 5 import org.springframework.security.core.authority.AuthorityUtils; 6 import org.springframework.security.core.userdetails.User; 7 import org.springframework.security.core.userdetails.UserDetails; 8 import org.springframework.security.core.userdetails.UserDetailsService; 9 import org.springframework.security.core.userdetails.UsernameNotFoundException; 10 import org.springframework.stereotype.Component; 11 12 @Component 13 public class MyUserDetailsService implements UserDetailsService { 14 private Logger logger = LoggerFactory.getLogger(getClass()); 15 @Override 16 public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { 17 logger.info("登录用户名:" + s); 18 // 根据用户名查找用户信息 19 return new User(s,"admin", 20 true,true,true,true, 21 AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_USER")); //默认情况下,认证服务器的请求必须要有一个ROLE_USER的角色才能访问 22 } 23 }
因为SpringSecurity5以后的版本密码默认是加密的,所以我想你需要声明一下。
1 @Bean 2 public PasswordEncoder passwordEncoder(){ 3 return NoOpPasswordEncoder.getInstance(); 4 }
⒉处理用户检验逻辑
1 package org.springframework.security.core.userdetails; 2 3 import java.io.Serializable; 4 import java.util.Collection; 5 import org.springframework.security.core.GrantedAuthority; 6 7 public interface UserDetails extends Serializable { 8 /** 9 * 获取用户权限列表 10 * @return 11 */ 12 Collection<? extends GrantedAuthority> getAuthorities(); 13 14 /** 15 * 获取用户密码 16 * @return 17 */ 18 String getPassword(); 19 20 /** 21 * 获取用户名 22 * @return 23 */ 24 String getUsername(); 25 26 /** 27 * 账户是否过期 28 * @return true==没有过期,falst==账户已过期 29 */ 30 boolean isAccountNonExpired(); 31 32 /** 33 * 账户是否被锁定,一般用来判断账户是否被冻结 34 * @return 35 */ 36 boolean isAccountNonLocked(); 37 38 /** 39 * 账户密码是否过期 40 * @return true==没有过期,falst==已过期 41 */ 42 boolean isCredentialsNonExpired(); 43 44 /** 45 * 账户是否可用,一般用来判断账户是否被删除 46 * @return 47 */ 48 boolean isEnabled(); 49 }
⒊处理用户密码加密解密
1 package org.springframework.security.crypto.password; 2 3 public interface PasswordEncoder { 4 5 /** 6 * 把用户的密码进行加密,新增用户的时候需要我们调用 7 * @param var1 8 * @return 9 */ 10 String encode(CharSequence var1); 11 12 /** 13 * 判断加密后的密码和用户输入的密码是否匹配,SpringSecurity自动调用 14 * @param var1 15 * @param var2 16 * @return 17 */ 18 boolean matches(CharSequence var1, String var2); 19 20 /** 21 * 22 * @param encodedPassword 23 * @return 24 */ 25 default boolean upgradeEncoding(String encodedPassword) { 26 return false; 27 } 28 }
1 @Bean 2 public PasswordEncoder passwordEncoder(){ 3 return new BCryptPasswordEncoder(); //推荐使用这个 4 }