使用 userDetailsService 的 Spring Boot 安全性
Posted
技术标签:
【中文标题】使用 userDetailsService 的 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);
如果存储库找不到用户,将抛出错误。
希望这能回答你的问题。
【讨论】:
以上是关于使用 userDetailsService 的 Spring Boot 安全性的主要内容,如果未能解决你的问题,请参考以下文章
使用 JdbcUserDetailsManager 与自己的 UserDetailsService
带有自定义 UserDetailsService 的 Spring Boot
使用 userDetailsService 的 Spring Boot 安全性
spring-security-oauth2 2.0.7 刷新令牌 UserDetailsService 配置 - UserDetailsService 是必需的