使用 userDetailsS​​ervice 的 Spring Boot 安全性

Posted

技术标签:

【中文标题】使用 userDetailsS​​ervice 的 Spring Boot 安全性【英文标题】:Spring boot security using userDetailsService 【发布时间】:2018-01-15 03:02:41 【问题描述】:
@Service
public class UserDetService implements UserDetailsService
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException 
    User user = userRepository.findByUserName(userName);
    if(user == null)
        throw new UsernameNotFoundException(userName);
    
    return new UserPrincipal(user);



SecConfig.java

@Configuration
@EnableWebSecurity
public class SecConfig extends WebSecurityConfigurerAdapter
@Bean
public UserDetailsService userDetailsService()
    return new UserDetService();


@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception
    auth.userDetailsService(userDetailsService());

@Override
protected void configure(HttpSecurity http) throws Exception 
    http.authorizeRequests()
      .antMatchers("/hello").access("hasRole('ROLE_ADMIN')")  
      .anyRequest().permitAll()
      .and()
        .formLogin().loginPage("/login")
        .usernameParameter("username").passwordParameter("password")
      .and()
        .logout().logoutSuccessUrl("/login?logout") 
       .and()
       .exceptionHandling().accessDeniedPage("/403")
      .and()
        .csrf();




我正在学习 Spring Security,但没有人问我是否正确,这是为了确保登录身份验证安全还是我错过了什么?

我还感到困惑,我没有编写任何查询来获取用户名和密码,如何从用户输入和数据库验证用户名和密码以及验证发生在哪里?

感谢这里有这么多乐于助人的人

【问题讨论】:

【参考方案1】:

您不需要编写查询,因为如果您使用jpa,它会为您编写查询。

这一行:User user = userRepository.findByUserName(userName);

将使用存储库自动生成查询以检查提供的参数是否返回任何内容并在您的服务中

if(user == null)
        throw new UsernameNotFoundException(userName);
    

如果存储库找不到用户,将抛出错误。

希望这能回答你的问题。

【讨论】:

以上是关于使用 userDetailsS​​ervice 的 Spring Boot 安全性的主要内容,如果未能解决你的问题,请参考以下文章

使用 JdbcUserDetailsManager 与自己的 UserDetailsS​​ervice

带有自定义 UserDetailsS​​ervice 的 Spring Boot

使用 userDetailsS​​ervice 的 Spring Boot 安全性

spring-security-oauth2 2.0.7 刷新令牌 UserDetailsS​​ervice 配置 - UserDetailsS​​ervice 是必需的

使用我的自定义 UserDetailsS​​ervice 后,httpsession 生命周期事件不起作用

Spring security - 未调用自定义 userDetailsS​​ervice 实现