实现UserDetailsService达成用户名登录和短信登录
来源:4-12 短信登录配置及重构
mjka5632
2018-04-01
@Component
public class MyUserDetailsService implements UserDetailsService {
private Logger logger= LoggerFactory.getLogger(getClass());
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
TUser user = userRepository.findByUsername(username);
if (user != null) {
logger.info("登录用户名:"+user.getUsername());
logger.info("密码:"+passwordEncoder.encode(user.getPassword()));
logger.info("User---->{}",user.toString());
return user;
}
user.setUsername("查无此人");
logger.info("User---->{}",user.toString());
return user;
}
}@Component
public class MobileDetailsService implements UserDetailsService {
private Logger logger= LoggerFactory.getLogger(getClass());
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String telPhone) throws UsernameNotFoundException {
TUser user = userRepository.findByTelPhone(telPhone);
if (user != null) {
logger.info("登录用户名:"+user.getUsername());
logger.info("User---->{}",user.toString());
return user;
}
throw new InternalAuthenticationServiceException("无法获取用户信息");
}
}@Configuration
public class SmsCodeAuthenticationSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain,HttpSecurity> {
@Autowired
private AuthenticationFailureHandler imoocAuthenticationFailureHandler;
@Autowired
private AuthenticationSuccessHandler imoocAuthenticationSuccessHandler;
@Autowired
// @Qualifier("mobileDetailsService")
@Qualifier("mobileDetailsService")
private UserDetailsService userDetailsService;@Configuration
public class BrowserSecurityConfig extends AbstractChannelSecurityConfig {
@Autowired
private SecurityProperties securityProperties;
//IDE错误,此处忽略
@Autowired
private DataSource dataSource;
@Autowired
@Qualifier("myUserDetailsService")
private UserDetailsService userDetailsService;现在出现的问题是用户名登录走的不是我自己打的loadUserByUsername()而是InMemoryUserDetailsManager()走到这个类中,请问老师怎么解决这个问题?
写回答
2回答
-

如图,在configure方法中,明确的指定使用的userDetailsService接口实现
012018-04-02 -
mjka5632
提问者
2018-04-02
@Configuration public class BrowserSecurityConfig extends AbstractChannelSecurityConfig { @Autowired private SecurityProperties securityProperties; //IDE错误,此处忽略 @Autowired private DataSource dataSource; @Autowired @Qualifier("myUserDetailsService") private UserDetailsService userDetailsService; @Autowired private SmsCodeAuthenticationSecurityConfig smsCodeAuthenticationSecurityConfig; @Autowired private ValidateCodeSecurityConfig validateCodeSecurityConfig; /** * * @param http * @throws Exception */ @Override protected void configure(HttpSecurity http) throws Exception { applyPassowrdAuthenticationConfig(http); //导入配置 http.apply(validateCodeSecurityConfig) .and() //--------------身份认证 .apply(smsCodeAuthenticationSecurityConfig) .and() //记住我功能 .rememberMe() //设置数据库Token .tokenRepository(persistentTokenRepository()) //设置时效 .tokenValiditySeconds(securityProperties.getBrowser().getRememberMeSeconds()) //拿到User信息 .userDetailsService(userDetailsService) //basic方式 // http.httpBasic() .and() //--------对请求做授权(下面都是对授权的配置) .authorizeRequests() //这个url无需认证 .antMatchers(SecurityConstants.DEFAULT_LOGIN_PROCESSING_URL_FORM, SecurityConstants.DEFAULT_UNAUTHENTICATION_URL, securityProperties.getBrowser().getLoginPage(), SecurityConstants.DEFAULT_VALIDATE_CODE_URL_PREFIX+"/*") .permitAll() //任何请求 .anyRequest() //都需要做身份认证 .authenticated() .and() //跨站请求防护 .csrf().disable() ; }00
Spring Security技术栈开发企业级认证与授权
Spring Security技术栈,REST风格开发常见接口,独立开发认证授权模块保证REST服务安全
2662 学习 · 1561 问题
相似问题
第三方登录,如何实现记住我
回答 1
微信登录绑定后 直接登录
回答 1
