【问题标题】:JWT Authentication with Spring boot Withot using userDetail使用 Spring Boot 进行 JWT 身份验证而不使用 userDetails
【发布时间】:2021-05-21 03:37:23
【问题描述】:

我正在为移动应用程序实现 REST API,并希望在其中使用 JWT 令牌。我通过使用 userDetials 对象实现了这一点。 现在我的问题是我在数据库中没有用户表,我只有一个电话号码和 UUID。 我们可以通过将签名更改为使用电话号码作为签名来实现这一点。 但我的问题是我将如何验证每个请求? 以及如何使用我自己的不包含用户名和密码的对象来验证令牌。 根据我的实现,我将不得不设置弹簧安全性以及何时使用弹簧安全性。 Spring Security 将需要 UserDetail 服务,这将给我返回 spring User 对象。 任何帮助将不胜感激。

【问题讨论】:

    标签: java spring-boot spring-security jwt


    【解决方案1】:

    根据我的comment,您应该创建一个自定义用户详细信息服务。您的 SimpleUserDetailsS​​ervice 类的 loadUserByUsername() 方法应该返回您的自定义用户详细信息。

    实体

    public class Pojo {
        private String phoneNumber;
        private String uuid;
    
        // Getters Setters Constructors
    }
    

    自定义用户详细信息

    public class CustomUserDetails implements UserDetails {
        private String username;
        private String password;
        private List<GrantedAuthority> authorities;
    
        public CustomUserDetails(Pojo pojo) {
            this.username = pojo.getPhoneNumber();
            this.password = pojo.getUuid();
    
            authorities = new ArrayList<>();
        }
    
        @Override
        public Collection<? extends GrantedAuthority> getAuthorities() {
            return authorityList;
        }
    
        @Override
        public String getPassword() {
            return password;
        }
    
        @Override
        public String getUsername() {
            return username;
        }
    
        @Override
        public boolean isAccountNonExpired() {
            return true;
        }
    
        @Override
        public boolean isAccountNonLocked() {
            return true;
        }
    
        @Override
        public boolean isCredentialsNonExpired() {
            return true;
        }
    
        @Override
        public boolean isEnabled() {
          return true;
        }
    
    }
    

    用户详情服务实现

    【讨论】:

      【解决方案2】:

      您可以通过实现用户详细信息来覆盖它 这是一个通过用户名和域进行身份验证的示例

      public class SimpleUserDetailsService implements UserDetailsService {
      
          // ...
      
          @Override
          public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
              String usernameAndDomain = StringUtils.split(
                username, String.valueOf(Character.LINE_SEPARATOR));//split as much as you want
              if (usernameAndDomain == null || usernameAndDomain.length != 2) {
                  throw new UsernameNotFoundException("Username and domain must be provided");
              }
              User user = userRepository.findUser(usernameAndDomain[0], usernameAndDomain[1]);
              if (user == null) {
                  throw new UsernameNotFoundException(
                    String.format("Username not found for domain, username=%s, domain=%s", 
                      usernameAndDomain[0], usernameAndDomain[1]));
              }
              return user;
          }
      }
      

      【讨论】:

      • 嗨,卡里姆,我根本没有用户对象。用户用户 = userRepository.findUser(usernameAndDomain[0], usernameAndDomain[1]);这条线将如何运作?
      • 这只是一个示例,用户可以是任何实现此接口的对象docs.spring.io/spring-security/site/docs/current/api/org/…
      • 你可以创建一个自定义的 userdetails 类来实现 org.springframework.security.core.userdetails.UserDetails 接口。将您的类 [包含电话号码和 UUID] 传递给您的自定义 userdetails 类的构造函数。覆盖 getUsername() 和 getPassword() 方法,分别返回您的电话号码和 UUID。 SimpleUserDetailsS​​ervice.loadUserByUsername() 方法应该返回您的自定义 userdetails 类。
      猜你喜欢
      • 2018-08-29
      • 2018-03-12
      • 2018-07-04
      • 2018-02-27
      • 2017-11-25
      • 2023-03-19
      • 1970-01-01
      • 2021-06-24
      • 2016-04-07
      相关资源
      最近更新 更多