| 
					
				 | 
			
			
				@ -1,11 +1,11 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				package com.yihu.jw.security.oauth2.provider; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.security.core.userdetails.SaltUser; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.security.oauth2.core.redis.WlyyRedisVerifyCodeService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.security.authentication.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.security.core.Authentication; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.security.core.GrantedAuthority; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.security.core.authority.SimpleGrantedAuthority; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.security.core.context.SecurityContextHolder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.security.core.userdetails.UserDetailsService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.security.oauth2.common.OAuth2AccessToken; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.security.oauth2.common.exceptions.InvalidClientException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.security.oauth2.common.exceptions.InvalidGrantException; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -35,7 +35,8 @@ public class WlyyTokenGranter implements TokenGranter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            AuthorizationCodeServices authorizationCodeServices, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            ClientDetailsService clientDetailsService, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            OAuth2RequestFactory requestFactory, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            WlyyRedisVerifyCodeService wlyyRedisVerifyCodeService) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            WlyyRedisVerifyCodeService wlyyRedisVerifyCodeService, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            UserDetailsService userDetailsService) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        tokenGranters.put(WlyyAuthorizationCodeGranter.GRANT_TYPE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                new WlyyAuthorizationCodeGranter( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -73,7 +74,8 @@ public class WlyyTokenGranter implements TokenGranter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        tokenServices, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        clientDetailsService, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        requestFactory, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        wlyyRedisVerifyCodeService 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        wlyyRedisVerifyCodeService, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        userDetailsService 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                )); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -237,7 +239,7 @@ public class WlyyTokenGranter implements TokenGranter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * Implicit模式Token授权器。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * implicit模式Token授权器。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public static class WlyyImplicitTokenGranter extends AbstractTokenGranter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        private static final String GRANT_TYPE = "implicit"; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -272,32 +274,37 @@ public class WlyyTokenGranter implements TokenGranter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * verify_code模式Token授权器。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * captcha模式Token授权器。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public static class WlyyCaptchaTokenGranter extends AbstractTokenGranter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        private static final String GRANT_TYPE = "captcha"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        private final AuthenticationManager authenticationManager; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        // Ehr Properties 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        // Customize Properties 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        private final WlyyRedisVerifyCodeService wlyyRedisVerifyCodeService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        private final UserDetailsService userDetailsService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        public WlyyCaptchaTokenGranter(AuthenticationManager authenticationManager, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                         AuthorizationServerTokenServices tokenServices, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                         ClientDetailsService clientDetailsService, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                         OAuth2RequestFactory requestFactory, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                         WlyyRedisVerifyCodeService wlyyRedisVerifyCodeService) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            this(authenticationManager, tokenServices, clientDetailsService, requestFactory, GRANT_TYPE, wlyyRedisVerifyCodeService); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                       AuthorizationServerTokenServices tokenServices, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                       ClientDetailsService clientDetailsService, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                       OAuth2RequestFactory requestFactory, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                       WlyyRedisVerifyCodeService wlyyRedisVerifyCodeService, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                       UserDetailsService userDetailsService) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            this(authenticationManager, tokenServices, clientDetailsService, requestFactory, wlyyRedisVerifyCodeService, userDetailsService, GRANT_TYPE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        protected WlyyCaptchaTokenGranter(AuthenticationManager authenticationManager, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            AuthorizationServerTokenServices tokenServices, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            ClientDetailsService clientDetailsService, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            OAuth2RequestFactory requestFactory, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            String grantType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            WlyyRedisVerifyCodeService wlyyRedisVerifyCodeService) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                          AuthorizationServerTokenServices tokenServices, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                          ClientDetailsService clientDetailsService, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                          OAuth2RequestFactory requestFactory, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                          WlyyRedisVerifyCodeService wlyyRedisVerifyCodeService, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                          UserDetailsService userDetailsService, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                          String grantType) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            super(tokenServices, clientDetailsService, requestFactory, grantType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            this.authenticationManager = authenticationManager; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            this.wlyyRedisVerifyCodeService = wlyyRedisVerifyCodeService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            this.userDetailsService = userDetailsService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        @Override 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -306,22 +313,25 @@ public class WlyyTokenGranter implements TokenGranter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Map<String, String> parameters = new LinkedHashMap<String, String>(tokenRequest.getRequestParameters()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String client_id = parameters.get("client_id"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String username = parameters.get("username"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String verify_code = parameters.get("captcha"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String captcha = parameters.get("captcha"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if (!wlyyRedisVerifyCodeService.verification(client_id, username, verify_code)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if (!wlyyRedisVerifyCodeService.verification(client_id, username, captcha)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                throw new InvalidGrantException("Invalid captcha"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Authentication userAuth = new UsernamePasswordAuthenticationToken(username, verify_code, getGrantedAuthorities(username)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            SaltUser userDetails = (SaltUser)userDetailsService.loadUserByUsername(username); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if (!userDetails.isEnabled()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                throw new InvalidGrantException("User is disabled"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if (!userDetails.isAccountNonLocked()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                throw new InvalidGrantException("User account is locked"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Authentication userAuth = new UsernamePasswordAuthenticationToken(userDetails.getUsername(), captcha, userDetails.getAuthorities()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            ((AbstractAuthenticationToken) userAuth).setDetails(parameters); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            OAuth2Request storedOAuth2Request = getRequestFactory().createOAuth2Request(client, tokenRequest); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return new OAuth2Authentication(storedOAuth2Request, userAuth); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        private Collection<? extends GrantedAuthority> getGrantedAuthorities(String username) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Collection<GrantedAuthority> authorities = new ArrayList<>(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            authorities.add(new SimpleGrantedAuthority("ROLE_USER")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return authorities; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 |