SpringCloud OAuth2 + JWT 인증 인증(一) 인증 서버

6210 단어 SpringCloud

시리즈


Spring Cloud oAuth2(1) 라이센스 서버 구축 및 액세스
Spring Cloud oAuth2(2) 리소스 서버 구축 및 테스트
SpringCloud OAuth2 + JWT 인증 인증(一) 인증 서버
SpringCloud OAuth2 + JWT 인증 인증(2) 리소스 서버

카탈로그


소개
솔리드 객체
권한 부여 구성
결말

소개


여기서 개인이 제3자 권한 수여 서비스를 구축하는 과정에서 겪은 문제점을 정리한다.만약 불필요한 제3자 로그인이 아니라면 하나의 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;
        }

    주의: 대상과 관련된 캐릭터 정보는 반드시 되돌아와야 합니다. (authorities) 여기 본인은 빨리 되돌아와야 합니다.

    권한 부여 구성

  • 간단한 조회 인터페이스를 실현한다
  • public interface UserDao extends JpaRepository {
    
        User findUserByUsername(String username);
    }
  • UserDetails Service를 구현하고loadUserByUsername 메서드를 다시 작성합니다
  • @Service
    public class UserService implements UserDetailsService {
    
        @Autowired
        private UserDao userDao;
    
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            return userDao.findUserByUsername(username);
        }
    }
  • 스프링 보안 관련 설정을 다시 작성하고 권한 수여 검증 방식을 설정합니다
  • @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig  extends WebSecurityConfigurerAdapter {
    
    
        @Autowired
        private UserService userService;
    
    
        @Bean
        public PasswordEncoder passwordEncoder()
        {
            return  new BCryptPasswordEncoder();
        }
    
    
        // http , 
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .csrf().disable()
                .exceptionHandling()
                .authenticationEntryPoint((request,response,authException)->response.sendError(HttpServletResponse.SC_UNAUTHORIZED))
                .and()
                .authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .httpBasic();
        }
    
        // 
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth
                .userDetailsService(userService)
                .passwordEncoder(passwordEncoder());
        }
    
    
        // 
        @Bean
        @Override
        public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
        }
    }
  • 권한 부여 서버 권한 부여 설정
  • @Configuration
    @EnableAuthorizationServer
    public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {
    
        @Autowired
        @Qualifier("authenticationManagerBean")
        public AuthenticationManager authenticationManager;
    
        @Autowired
        private PasswordEncoder passwordEncoder;
    
        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
            clients
                    .inMemory()
                    .withClient("kevin")
                    .secret(passwordEncoder.encode("kevin12345"))
                    .scopes("client")
                    .authorizedGrantTypes("password","refresh_token")
                    .accessTokenValiditySeconds(3600);
        }
    
        @Override
        public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
            endpoints
                    // 
                    .tokenStore(new JwtTokenStore(jwtTokenEnhancer()))
                    // 
                    .tokenEnhancer(jwtTokenEnhancer())
                    // 
                    .authenticationManager(authenticationManager);
        }
    
    
    
        //jwt , jwt 
        public JwtAccessTokenConverter jwtTokenEnhancer()
        {
            //RSA , , 
            KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("auth-jwt.jks"),"jwt12345".toCharArray());
            JwtAccessTokenConverter converter =  new JwtAccessTokenConverter();
            converter.setKeyPair(keyStoreKeyFactory.getKeyPair("auth-jwt","jwt12345".toCharArray()));
            return converter;
        }
    
        @Override
        public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
            security
                    .tokenKeyAccess("permitAll()")
                    .checkTokenAccess("permitAll()")
                    .allowFormAuthenticationForClients();
        }

    참고:
  • 여기 보기 키 storepass와 키 키 키 생성pass는 똑같습니다. 관련 RSA 개인 키와 공공 키 생성 블로그가 많습니다
  • Openssl로 공개 키 명령을 내보내려면 Openssl 서비스를 다운로드하여 설치해야 합니다
  • 공개 키는 디스플레이를 직접 복사할 수 있는publickey를 내보냅니다. (한 줄로 축소할 필요가 없습니다!)파일로 추출할 수도 있고, 프로그램을 써서 얻을 수도 있습니다

  • 결말


    이곳은 단지 간단한 데모일 뿐, 생산용은 아직 부족한 점이 많다. 예를 들어 토큰에서 물러나 효력을 잃는 등이다.

    좋은 웹페이지 즐겨찾기