Spring Security 6与数据库中的用户进行身份验证和授权[已关闭]

64jmpszr  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(129)

已关闭。此问题需要更多focused。目前不接受回答。
**要改进此问题吗?**更新此问题,使其仅针对editing this post的一个问题。

上个月关门了。
Improve this question
我有一个项目,如网上食品 Spring 订购系统平台,我使用Hibernate与两个模型,像这样:

  1. @Entity
  2. @Table(name = "users")
  3. public class User {
  4. @Id
  5. @GeneratedValue(strategy = GenerationType.IDENTITY)
  6. private Long id;
  7. private String username;
  8. private String password;
  9. private String email;
  10. private Long balance;
  11. }

个字符
我认为这个系统有三个角色:ROLE_SYSAADMIN,ROLE_ADMIN(食品商店),ROLE_CUSTOMER Users和UsersRole存储在数据库中。
如何使用Sping Boot 6为我的应用配置授权和身份验证?
我搜索并做了一些代码。首先,我写了一个自定义的UserDetailService像这样

  1. @Service
  2. public class HiruezUserDetailsService implements UserDetailsService {
  3. private final UserRepository userRepository;
  4. public HiruezUserDetailsService(UserRepository userRepository) {
  5. super();
  6. this.userRepository = userRepository;
  7. }
  8. @Override
  9. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  10. User user = userRepository.findByUsername(username)
  11. .orElseThrow(() -> new UsernameNotFoundException("User not found with username: " + username));
  12. return new HiruezUserDetails(user);
  13. }
  14. }


然后,自定义UserDetails,如:

  1. public class HiruezUserDetails implements UserDetails {
  2. /**
  3. *
  4. */
  5. private static final long serialVersionUID = 1L;
  6. private final User user;
  7. public HiruezUserDetails(User user) {
  8. this.user = user;
  9. }
  10. @Override
  11. public Collection<? extends GrantedAuthority> getAuthorities() {
  12. return Collections.singleton(new SimpleGrantedAuthority("ROLE_" + user.getRole().getName()));
  13. }
  14. @Override
  15. public String getPassword() {
  16. return user.getPassword();
  17. }
  18. @Override
  19. public String getUsername() {
  20. return user.getUsername();
  21. }
  22. @Override
  23. public boolean isAccountNonExpired() {
  24. return false;
  25. }
  26. @Override
  27. public boolean isAccountNonLocked() {
  28. return false;
  29. }
  30. @Override
  31. public boolean isCredentialsNonExpired() {
  32. return false;
  33. }
  34. @Override
  35. public boolean isEnabled() {
  36. return false;
  37. }
  38. }


最后一个是SecurityConfig.java像:

  1. @Configuration
  2. @EnableWebSecurity
  3. public class SecurityConfig {
  4. @Autowired
  5. private JdbcTemplate jdbcTemplate;
  6. @Autowired
  7. private HiruezUserDetailsService hiruezUserDetailsService;
  8. @Bean
  9. public PasswordEncoder passwordEncoder( ) {
  10. return new BCryptPasswordEncoder();
  11. }
  12. @Bean
  13. public JdbcUserDetailsManager jdbcUserDetailManager() {
  14. JdbcUserDetailsManager userDetailManager = new JdbcUserDetailsManager();
  15. userDetailManager.setJdbcTemplate(jdbcTemplate);
  16. return userDetailManager;
  17. }
  18. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  19. auth
  20. .userDetailsService(hiruezUserDetailsService)
  21. .passwordEncoder(passwordEncoder());
  22. }
  23. @Bean
  24. public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
  25. http
  26. .authorizeHttpRequests((authorize) -> authorize
  27. .requestMatchers("/admin/**").hasRole("SYSADMIN")
  28. .requestMatchers("/store/**").hasRole("ADMIN")
  29. .requestMatchers("/customer/**").hasRole("CUSTOMER")
  30. .anyRequest().authenticated()
  31. )
  32. .httpBasic(Customizer.withDefaults())
  33. .formLogin(form -> form
  34. .loginPage("/login")
  35. .permitAll()
  36. )
  37. .logout((logout) -> logout.logoutUrl("/logout"));
  38. return http.build();
  39. }
  40. }


但我工作....嗯
拜托,帮我修好或者给予我另一种方法。非常感谢。

pnwntuvh

pnwntuvh1#

让我们看看如何解决这个问题

  • 使用管理员先前设置的新列roleId更新用户表实体
  1. @Entity
  2. @Data
  3. @Builder
  4. @NoArgsConstructor
  5. @AllArgsConstructor
  6. @Table(name = "users")
  7. public class User implements UserDetails {
  8. @Id
  9. @GeneratedValue(strategy = GenerationType.IDENTITY)
  10. private Long id;
  11. private String username;
  12. private String password;
  13. private String email;
  14. private Long balance;
  15. private Long roleId; // new field , this field will set when admin create user by selecting role
  16. @Override
  17. public Collection<? extends GrantedAuthority> getAuthorities() {
  18. List<SimpleGrantedAuthority> authorities = new ArrayList<SimpleGrantedAuthority>();
  19. //authorities.add(new SimpleGrantedAuthority("ROLE_SYSADMIN"));
  20. //authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
  21. //authorities.add(new SimpleGrantedAuthority("ROLE_CUSTOMER"));
  22. // we will set the permission leater
  23. return authorities;
  24. }
  25. @Override
  26. public String getPassword() {
  27. return password;
  28. }
  29. @Override
  30. public String getUsername() {
  31. return username;
  32. }
  33. @Override
  34. public boolean isAccountNonExpired() {
  35. return true;
  36. }
  37. @Override
  38. public boolean isAccountNonLocked() {
  39. return true;
  40. }
  41. @Override
  42. public boolean isCredentialsNonExpired() {
  43. return true;
  44. }
  45. @Override
  46. public boolean isEnabled() {
  47. return true;
  48. }
  49. }

字符串

  • 用户存储库表
  1. public interface UserRepository extends JpaRepository<User, Long> {
  2. }

  • 用户角色表和存储库
  1. @Entity
  2. @Data
  3. @Builder
  4. @NoArgsConstructor
  5. @AllArgsConstructor
  6. @Table(name = "user_roles")
  7. public class UserRole {
  8. @Id
  9. @GeneratedValue(strategy = GenerationType.IDENTITY)
  10. private Long id;
  11. private String name;
  12. }
  13. public interface UserRoleRepository extends JpaRepository<UserRole, Long> {
  14. }

  • 创建自定义身份验证提供程序,以便从用户角色表中读取权限名称,并用于身份验证和授权
  1. @Component
  2. @RequiredArgsConstructor
  3. public class UserAuthenticationProvider implements AuthenticationProvider, UserDetailsService {
  4. private final UserRepository userRepository;
  5. private final UserRoleRepository userRoleRepository;
  6. @Override
  7. public Authentication authenticate(Authentication authentication) throws AuthenticationException {
  8. final String username = (authentication.getPrincipal() == null) ? "NONE_PROVIDED" : authentication.getName();
  9. if (Utils.isEmpty(username)) {
  10. throw new BadCredentialsException("invalid login details");
  11. }
  12. // get user details using Spring security user details service
  13. UserDetails user = null;
  14. try {
  15. user = loadUserByUsername(username);
  16. } catch (UsernameNotFoundException exception) {
  17. throw new BadCredentialsException("invalid login details");
  18. }
  19. return createSuccessfulAuthentication(authentication, user);
  20. }
  21. private Authentication createSuccessfulAuthentication(final Authentication authentication, final UserDetails user) {
  22. User dbUser = userRepository.findByUsername(user.getUsername());
  23. UserRole userRole = userRoleRepository.findById(dbUser.getRoleId());
  24. List<SimpleGrantedAuthority> authorities = new ArrayList<SimpleGrantedAuthority>();
  25. authorities.add(new SimpleGrantedAuthority(userRole.getName()));
  26. UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(user.getUsername(), authentication.getCredentials(), authorities);
  27. token.setDetails(authentication.getDetails());
  28. return token;
  29. }
  30. @Override
  31. public boolean supports(Class < ? > authentication) {
  32. return authentication.equals(UsernamePasswordAuthenticationToken.class);
  33. }
  34. @Override
  35. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  36. return userRepository.findByUsername(username)
  37. .orElseThrow(() -> new UsernameNotFoundException("User not found"));
  38. }
  39. }

  • 根据您的需要更新您的安全性,但使用上述身份验证提供程序
  1. @Configuration
  2. @EnableWebSecurity
  3. @RequiredArgsConstructor
  4. public class SecurityConfig {
  5. private final UserAuthenticationProvider userAuthenticationProvider;
  6. @Bean
  7. public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
  8. http
  9. // ...
  10. .authenticationProvider(userAuthenticationProvider);
  11. return http.build();
  12. }
  13. }

展开查看全部

相关问题