SpringCloud OAuth 2+JWT認証認可(二)リソースサーバ

6378 ワード

シリーズ記事


Spring Cloud oAuth 2(一)ライセンスサーバの構築とアクセス
Spring Cloud oAuth 2(二)リソースサーバの構築及びテスト
SpringCloud OAuth 2+JWT認証認証認証(一)認証サーバ
SpringCloud OAuth 2+JWT認証認可(二)リソースサーバ
 

目次


概要
エンティティオブジェクト
リソースサーバの構成
アクセス構成
ログインロジック
まとめ

概要


ここでは、第三者のライセンスサービスを構築する過程で、個人が直面した問題をまとめます.必要でないサードパーティのログインでなければ、単一のJWTで簡単な認証を満たすことができますが、関連する認証と認証は自分で書く必要があります.本明細書のソース:ソースアドレス.

エンティティオブジェクト

  • ロール
  • @Data
    @Entity
    public class Role implements GrantedAuthority, Serializable {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @Column(nullable = false,unique = true)
        private String name;
    
        @Override
        public String getAuthority() {
            return name;
        }
    }
  • ユーザおよびロールとの対応関係
  • @Data
    @Entity
    public class User implements UserDetails, Serializable {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @Column(nullable = false,unique = true)
        private String username;
    
        private String password;
    
        @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
        @JoinTable(
                name = "user_role",
                joinColumns = {@JoinColumn(name = "user_id",referencedColumnName = "id")},
                inverseJoinColumns = {@JoinColumn(name="role_id",referencedColumnName = "id")}
        )
        List authorities;
    
        @Override
        public Collection extends GrantedAuthority> getAuthorities() {
            return authorities;
        }
    
        @Override
        public boolean isAccountNonExpired() {
            return true;
        }
    
        @Override
        public boolean isAccountNonLocked() {
            return true;
        }
    
        @Override
        public boolean isCredentialsNonExpired() {
            return true;
        }
    
        @Override
        public boolean isEnabled() {
            return true;
        }
    }
    
  • ライセンス返却タイプ
  • @Data
    public class MyJWT {
    
        String access_token;
        String token_type;
        String expires_in;
        String scope;
    }
    

    リソースサーバの構成

  • jwt暗号暗号化方式及び暗号変換方式構成
  • @Configuration
    public class JwtConfig {
    
    
        @Bean
        public PasswordEncoder passwordEncoder()
        {
            return new BCryptPasswordEncoder();
        }
    
    
        @Bean
        public TokenStore tokenStore()
        {
            return  new JwtTokenStore(jwtAccessTokenConverter());
        }
    
        @Bean
        public JwtAccessTokenConverter jwtAccessTokenConverter()
        {
            JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
            ClassPathResource resource = new ClassPathResource("public.cert");
            try {
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
                String publicKey = bufferedReader.lines().collect(Collectors.joining("
    ")); converter.setVerifierKey(publicKey); } catch (IOException e) { e.printStackTrace(); } return converter; } }

    注意:
  • ここで公開鍵を取得する方法は正しい(改行しない)
  • である.
  • setVerifierKeyとseySignKeyの違いは、非対称および対称暗号化
  • である.
  • リソースサーバ構成
  • @EnableResourceServer
    @Configuration
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
    
        @Autowired
        public TokenStore tokenStore;
    
        @Override
        public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
            resources.tokenStore(tokenStore);
        }
    
        @Override
        public void configure(HttpSecurity http) throws Exception {
            http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/user/login","/user/one").permitAll()
                .anyRequest().authenticated();
        }
    
    }

    アクセス構成

  • feign構成(再試行回数、タイムアウト時間等)
  • @Configuration
    public class FeignConfig {
    
        @Bean
        public Retryer feignRetryer()
        {
            return  new Retryer.Default(100,1000,5);
        }
    }
    
  • feignアクセスサービス
  • 
    //feign serviceId 
    @FeignClient(value = "auth-service",fallback = FeignHystrix.class,configuration = FeignConfig.class)
    public interface AuthService {
    
        @PostMapping("/oauth/token")
        MyJWT getToken(@RequestParam("client_id") String client_id, @RequestParam("client_secret")String client_secret,@RequestParam("username")String username,@RequestParam("password")String password, @RequestParam("grant_type") String grant_type);
    
    }
  • hystrixヒューズ処理
  • // 
    @Component
    public class FeignHystrix implements AuthService {
    
        @Override
        public MyJWT getToken(String client_id, String client_secret, String username, String password, String grant_type) {
            System.out.println(" ");
            return null;
        }
    }
    

    ログインロジック

    @Service
    public class UserService {
    
       @Autowired
       private UserDao userDao;
    
       @Autowired
       private PasswordEncoder passwordEncoder;
    
       @Autowired
       private AuthService authService;
    
       public void addUser(User user)
       {
          user.setPassword(passwordEncoder.encode(user.getPassword()));
          userDao.save(user);
       }
    
       public MyResponse login(User user)
       {
          User findUser = userDao.findByUsername(user.getUsername());
          if(null==findUser)
          {
             throw new MyException(" !",501);
          }
          else if(!passwordEncoder.matches(user.getPassword(),findUser.getPassword()))
          {
             throw new MyException(" !",502);
          }
          MyJWT token = authService.getToken("kevin", "kevin12345", user.getUsername(),user.getPassword(),"password");
          return new MyResponse(token);
       }
    

    まとめ


    個人的にプレイしている間にライセンスモードをclientに変更しましたcredentialsクライアント方式、また権限管理制御を追加して、アクセスはずっとアクセスできないことを表示して、愚かで長い間、それからやっと悟って、クライアント方式はデータベースに入って権限を取得していないので、権限はずっと空で、汗..ところで、現在のコードは完全ではありません.完全なコードが必要な場合は、ソースアドレスにアクセスしてください.