|  | @ -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;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | }
 | 
	
		
			
				|  |  | 
 |