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     }
原文地址:https://www.cnblogs.com/fanqisoft/p/10616845.html