From cf23ce4776bfe6f9fc7dc7598e37706506ff34d0 Mon Sep 17 00:00:00 2001 From: marongjiang Date: Tue, 21 May 2019 10:39:42 +0800 Subject: [PATCH 1/8] =?UTF-8?q?1=E3=80=81oauth=20sms=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BF=AE=E6=94=B9=20AuthorizationServerConfi?= =?UTF-8?q?guration=20=E7=94=B1=E4=BA=8Eprivate=20List=20tok?= =?UTF-8?q?enGranters=E5=92=8CAuthorizationServerConfiguration=20=E8=BF=98?= =?UTF-8?q?=E6=9C=89=E4=B8=80=E4=B8=AA=E7=B1=BB=E5=AD=98=E5=9C=A8=E7=9B=B8?= =?UTF-8?q?=E4=BA=92=E4=BE=9D=E8=B5=96=EF=BC=8C=E5=AF=BC=E8=87=B4Authoriza?= =?UTF-8?q?tionServerConfiguration=20=E5=88=9D=E5=A7=8B=E5=8C=96=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E8=83=BD=E8=8E=B7=E5=8F=96=E5=88=B0tokenGran?= =?UTF-8?q?ters=E5=AF=BC=E8=87=B4=E6=89=A9=E5=B1=95=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E4=B8=8D=E8=83=BD=E6=88=90=E5=8A=9F=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=EF=BC=8C=E6=89=80=E4=BB=A5=E4=BF=AE=E6=94=B9tokenGran?= =?UTF-8?q?ters=E7=9A=84=E9=85=8D=E7=BD=AE=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2、oauth接口也增加token验证,与web接口保持一致才能登陆成功 --- .../auth/common/client/app/SsoAuthClient.java | 229 +++++++++--------- .../oauth2/sms/SmsAccessTokenProvider.java | 153 ++++++------ .../common/oauth2/sms/SmsResourceDetails.java | 72 +++--- .../AuthorizationServerConfiguration.java | 46 +++- .../cola-auth-oauth2-sms/pom.xml | 6 - .../cola/sso/smaple/app/AuthController.java | 96 ++++---- .../app/ResourceServerConfiguration.java | 50 ++-- 7 files changed, 351 insertions(+), 301 deletions(-) diff --git a/cola-auth/cola-auth-client/cola-auth-client-app/src/main/java/com/honvay/cola/auth/common/client/app/SsoAuthClient.java b/cola-auth/cola-auth-client/cola-auth-client-app/src/main/java/com/honvay/cola/auth/common/client/app/SsoAuthClient.java index 6dc8c61..c832545 100644 --- a/cola-auth/cola-auth-client/cola-auth-client-app/src/main/java/com/honvay/cola/auth/common/client/app/SsoAuthClient.java +++ b/cola-auth/cola-auth-client/cola-auth-client-app/src/main/java/com/honvay/cola/auth/common/client/app/SsoAuthClient.java @@ -1,114 +1,115 @@ -package com.honvay.cola.auth.common.client.app; - -import com.honvay.cola.auth.client.common.oauth2.ac.AcAccessTokenProvider; -import com.honvay.cola.auth.client.common.oauth2.ac.AcResourceDetails; -import com.honvay.cola.auth.client.common.oauth2.openid.OpenIdAccessTokenProvider; -import com.honvay.cola.auth.client.common.oauth2.openid.OpenIdResourceDetails; -import com.honvay.cola.auth.client.common.oauth2.sms.SmsAccessTokenProvider; -import com.honvay.cola.auth.client.common.oauth2.sms.SmsResourceDetails; -import com.honvay.cola.framework.core.protocol.Result; -import org.springframework.security.oauth2.client.OAuth2RestTemplate; -import org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordAccessTokenProvider; -import org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordResourceDetails; -import org.springframework.security.oauth2.common.OAuth2AccessToken; - -/** - * @author LIQIU - * created on 2018-11-27 - **/ -public class SsoAuthClient { - - private SsoClientProperties properties; - - - public SsoAuthClient(SsoClientProperties properties) { - this.properties = properties; - } - - /** - * 登录 - * - * @param username - * @param password - * @return - */ - public OAuth2AccessToken login(String username, String password) { - ResourceOwnerPasswordResourceDetails details = new ResourceOwnerPasswordResourceDetails(); - details.setUsername(username); - details.setPassword(password); - details.setAccessTokenUri(this.properties.getAccessTokenUri()); - details.setClientId(this.properties.getClientId()); - details.setClientSecret(this.properties.getClientSecret()); - OAuth2RestTemplate auth2RestTemplate = new OAuth2RestTemplate(details); - auth2RestTemplate.setAccessTokenProvider(new ResourceOwnerPasswordAccessTokenProvider()); - return auth2RestTemplate.getAccessToken(); - } - - /** - * 退出 - * - * @return - */ - public Result logout() { - OAuth2RestTemplate auth2RestTemplate = new OAuth2RestTemplate(properties); - auth2RestTemplate.getForObject(properties.getRevokeTokenUri(), String.class); - return Result.success(); - } - - /** - * openId登录 - * - * @param openId openid - * @param provider 供应商 - * @return - */ - public OAuth2AccessToken loginByOpenId(String openId, String provider) { - OpenIdResourceDetails details = new OpenIdResourceDetails(); - details.setOpenId(openId); - details.setProvider(provider); - details.setAccessTokenUri(this.properties.getAccessTokenUri()); - details.setClientId(this.properties.getClientId()); - details.setClientSecret(this.properties.getClientSecret()); - OAuth2RestTemplate auth2RestTemplate = new OAuth2RestTemplate(details); - auth2RestTemplate.setAccessTokenProvider(new OpenIdAccessTokenProvider()); - return auth2RestTemplate.getAccessToken(); - } - - /** - * 短信登录 - * - * @param phoneNumber 手机号码 - * @param credential 验证码 - * @return - */ - public OAuth2AccessToken loginBySms(String phoneNumber, String credential) { - SmsResourceDetails details = new SmsResourceDetails(); - details.setPhoneNumber(phoneNumber); - details.setCredential(credential); - details.setAccessTokenUri(this.properties.getAccessTokenUri()); - details.setClientId(this.properties.getClientId()); - details.setClientSecret(this.properties.getClientSecret()); - OAuth2RestTemplate auth2RestTemplate = new OAuth2RestTemplate(details); - auth2RestTemplate.setAccessTokenProvider(new SmsAccessTokenProvider()); - return auth2RestTemplate.getAccessToken(); - } - - /** - * 授权码登录 - * - * @param authorizationCode 授权码 - * @param provider 第三方 - * @return - */ - public OAuth2AccessToken loginByAuthorizationCode(String authorizationCode, String provider) { - AcResourceDetails details = new AcResourceDetails(); - details.setProvider(provider); - details.setAuthorizationCode(authorizationCode); - details.setAccessTokenUri(this.properties.getAccessTokenUri()); - details.setClientId(this.properties.getClientId()); - details.setClientSecret(this.properties.getClientSecret()); - OAuth2RestTemplate auth2RestTemplate = new OAuth2RestTemplate(details); - auth2RestTemplate.setAccessTokenProvider(new AcAccessTokenProvider()); - return auth2RestTemplate.getAccessToken(); - } -} +package com.honvay.cola.auth.common.client.app; + +import com.honvay.cola.auth.client.common.oauth2.ac.AcAccessTokenProvider; +import com.honvay.cola.auth.client.common.oauth2.ac.AcResourceDetails; +import com.honvay.cola.auth.client.common.oauth2.openid.OpenIdAccessTokenProvider; +import com.honvay.cola.auth.client.common.oauth2.openid.OpenIdResourceDetails; +import com.honvay.cola.auth.client.common.oauth2.sms.SmsAccessTokenProvider; +import com.honvay.cola.auth.client.common.oauth2.sms.SmsResourceDetails; +import com.honvay.cola.framework.core.protocol.Result; +import org.springframework.security.oauth2.client.OAuth2RestTemplate; +import org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordAccessTokenProvider; +import org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordResourceDetails; +import org.springframework.security.oauth2.common.OAuth2AccessToken; + +/** + * @author LIQIU + * created on 2018-11-27 + **/ +public class SsoAuthClient { + + private SsoClientProperties properties; + + + public SsoAuthClient(SsoClientProperties properties) { + this.properties = properties; + } + + /** + * 登录 + * + * @param username + * @param password + * @return + */ + public OAuth2AccessToken login(String username, String password) { + ResourceOwnerPasswordResourceDetails details = new ResourceOwnerPasswordResourceDetails(); + details.setUsername(username); + details.setPassword(password); + details.setAccessTokenUri(this.properties.getAccessTokenUri()); + details.setClientId(this.properties.getClientId()); + details.setClientSecret(this.properties.getClientSecret()); + OAuth2RestTemplate auth2RestTemplate = new OAuth2RestTemplate(details); + auth2RestTemplate.setAccessTokenProvider(new ResourceOwnerPasswordAccessTokenProvider()); + return auth2RestTemplate.getAccessToken(); + } + + /** + * 退出 + * + * @return + */ + public Result logout() { + OAuth2RestTemplate auth2RestTemplate = new OAuth2RestTemplate(properties); + auth2RestTemplate.getForObject(properties.getRevokeTokenUri(), String.class); + return Result.success(); + } + + /** + * openId登录 + * + * @param openId openid + * @param provider 供应商 + * @return + */ + public OAuth2AccessToken loginByOpenId(String openId, String provider) { + OpenIdResourceDetails details = new OpenIdResourceDetails(); + details.setOpenId(openId); + details.setProvider(provider); + details.setAccessTokenUri(this.properties.getAccessTokenUri()); + details.setClientId(this.properties.getClientId()); + details.setClientSecret(this.properties.getClientSecret()); + OAuth2RestTemplate auth2RestTemplate = new OAuth2RestTemplate(details); + auth2RestTemplate.setAccessTokenProvider(new OpenIdAccessTokenProvider()); + return auth2RestTemplate.getAccessToken(); + } + + /** + * 短信登录 + * + * @param phoneNumber 手机号码 + * @param credential 验证码 + * @return + */ + public OAuth2AccessToken loginBySms(String phoneNumber, String credential, String token) { + SmsResourceDetails details = new SmsResourceDetails(); + details.setPhoneNumber(phoneNumber); + details.setCredential(credential); + details.setToken(token); + details.setAccessTokenUri(this.properties.getAccessTokenUri()); + details.setClientId(this.properties.getClientId()); + details.setClientSecret(this.properties.getClientSecret()); + OAuth2RestTemplate auth2RestTemplate = new OAuth2RestTemplate(details); + auth2RestTemplate.setAccessTokenProvider(new SmsAccessTokenProvider()); + return auth2RestTemplate.getAccessToken(); + } + + /** + * 授权码登录 + * + * @param authorizationCode 授权码 + * @param provider 第三方 + * @return + */ + public OAuth2AccessToken loginByAuthorizationCode(String authorizationCode, String provider) { + AcResourceDetails details = new AcResourceDetails(); + details.setProvider(provider); + details.setAuthorizationCode(authorizationCode); + details.setAccessTokenUri(this.properties.getAccessTokenUri()); + details.setClientId(this.properties.getClientId()); + details.setClientSecret(this.properties.getClientSecret()); + OAuth2RestTemplate auth2RestTemplate = new OAuth2RestTemplate(details); + auth2RestTemplate.setAccessTokenProvider(new AcAccessTokenProvider()); + return auth2RestTemplate.getAccessToken(); + } +} diff --git a/cola-auth/cola-auth-client/cola-auth-client-common/src/main/java/com/honvay/cola/auth/client/common/oauth2/sms/SmsAccessTokenProvider.java b/cola-auth/cola-auth-client/cola-auth-client-common/src/main/java/com/honvay/cola/auth/client/common/oauth2/sms/SmsAccessTokenProvider.java index cbd5b05..94eeb80 100644 --- a/cola-auth/cola-auth-client/cola-auth-client-common/src/main/java/com/honvay/cola/auth/client/common/oauth2/sms/SmsAccessTokenProvider.java +++ b/cola-auth/cola-auth-client/cola-auth-client-common/src/main/java/com/honvay/cola/auth/client/common/oauth2/sms/SmsAccessTokenProvider.java @@ -1,76 +1,77 @@ -package com.honvay.cola.auth.client.common.oauth2.sms; - -import org.springframework.http.HttpHeaders; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResourceDetails; -import org.springframework.security.oauth2.client.resource.UserApprovalRequiredException; -import org.springframework.security.oauth2.client.resource.UserRedirectRequiredException; -import org.springframework.security.oauth2.client.token.AccessTokenProvider; -import org.springframework.security.oauth2.client.token.AccessTokenRequest; -import org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.common.OAuth2RefreshToken; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; - -import java.util.Iterator; -import java.util.List; - -/** - * @author LIQIU - * created on 2018-11-26 - **/ -public class SmsAccessTokenProvider extends OAuth2AccessTokenSupport implements AccessTokenProvider { - - - @Override - public OAuth2AccessToken obtainAccessToken(OAuth2ProtectedResourceDetails details, AccessTokenRequest request) throws UserRedirectRequiredException, UserApprovalRequiredException, AccessDeniedException { - SmsResourceDetails resource = (SmsResourceDetails) details; - return retrieveToken(request, resource, getParametersForTokenRequest(resource, request), new HttpHeaders()); - } - - @Override - public boolean supportsResource(OAuth2ProtectedResourceDetails resource) { - return resource.getClass().equals(SmsResourceDetails.class); - } - - @Override - public OAuth2AccessToken refreshAccessToken(OAuth2ProtectedResourceDetails resource, OAuth2RefreshToken refreshToken, AccessTokenRequest request) throws UserRedirectRequiredException { - return null; - } - - @Override - public boolean supportsRefresh(OAuth2ProtectedResourceDetails resource) { - return supportsResource(resource); - } - - private MultiValueMap getParametersForTokenRequest(SmsResourceDetails resource, AccessTokenRequest request) { - - MultiValueMap form = new LinkedMultiValueMap(); - form.set("grant_type", "sms"); - form.set("phoneNumber", resource.getPhoneNumber()); - form.set("credential", resource.getCredential()); - form.putAll(request); - - if (resource.isScoped()) { - - StringBuilder builder = new StringBuilder(); - List scope = resource.getScope(); - - if (scope != null) { - Iterator scopeIt = scope.iterator(); - while (scopeIt.hasNext()) { - builder.append(scopeIt.next()); - if (scopeIt.hasNext()) { - builder.append(' '); - } - } - } - - form.set("scope", builder.toString()); - } - - return form; - - } -} +package com.honvay.cola.auth.client.common.oauth2.sms; + +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResourceDetails; +import org.springframework.security.oauth2.client.resource.UserApprovalRequiredException; +import org.springframework.security.oauth2.client.resource.UserRedirectRequiredException; +import org.springframework.security.oauth2.client.token.AccessTokenProvider; +import org.springframework.security.oauth2.client.token.AccessTokenRequest; +import org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport; +import org.springframework.security.oauth2.common.OAuth2AccessToken; +import org.springframework.security.oauth2.common.OAuth2RefreshToken; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +import java.util.Iterator; +import java.util.List; + +/** + * @author LIQIU + * created on 2018-11-26 + **/ +public class SmsAccessTokenProvider extends OAuth2AccessTokenSupport implements AccessTokenProvider { + + + @Override + public OAuth2AccessToken obtainAccessToken(OAuth2ProtectedResourceDetails details, AccessTokenRequest request) throws UserRedirectRequiredException, UserApprovalRequiredException, AccessDeniedException { + SmsResourceDetails resource = (SmsResourceDetails) details; + return retrieveToken(request, resource, getParametersForTokenRequest(resource, request), new HttpHeaders()); + } + + @Override + public boolean supportsResource(OAuth2ProtectedResourceDetails resource) { + return resource.getClass().equals(SmsResourceDetails.class); + } + + @Override + public OAuth2AccessToken refreshAccessToken(OAuth2ProtectedResourceDetails resource, OAuth2RefreshToken refreshToken, AccessTokenRequest request) throws UserRedirectRequiredException { + return null; + } + + @Override + public boolean supportsRefresh(OAuth2ProtectedResourceDetails resource) { + return supportsResource(resource); + } + + private MultiValueMap getParametersForTokenRequest(SmsResourceDetails resource, AccessTokenRequest request) { + + MultiValueMap form = new LinkedMultiValueMap(); + form.set("grant_type", "sms"); + form.set("phoneNumber", resource.getPhoneNumber()); + form.set("credential", resource.getCredential()); + form.set("token", resource.getToken()); + form.putAll(request); + + if (resource.isScoped()) { + + StringBuilder builder = new StringBuilder(); + List scope = resource.getScope(); + + if (scope != null) { + Iterator scopeIt = scope.iterator(); + while (scopeIt.hasNext()) { + builder.append(scopeIt.next()); + if (scopeIt.hasNext()) { + builder.append(' '); + } + } + } + + form.set("scope", builder.toString()); + } + + return form; + + } +} diff --git a/cola-auth/cola-auth-client/cola-auth-client-common/src/main/java/com/honvay/cola/auth/client/common/oauth2/sms/SmsResourceDetails.java b/cola-auth/cola-auth-client/cola-auth-client-common/src/main/java/com/honvay/cola/auth/client/common/oauth2/sms/SmsResourceDetails.java index edd2f57..153bfd8 100644 --- a/cola-auth/cola-auth-client/cola-auth-client-common/src/main/java/com/honvay/cola/auth/client/common/oauth2/sms/SmsResourceDetails.java +++ b/cola-auth/cola-auth-client/cola-auth-client-common/src/main/java/com/honvay/cola/auth/client/common/oauth2/sms/SmsResourceDetails.java @@ -1,30 +1,42 @@ -package com.honvay.cola.auth.client.common.oauth2.sms; - -import org.springframework.security.oauth2.client.resource.BaseOAuth2ProtectedResourceDetails; - -/** - * @author LIQIU - * created on 2018-11-27 - **/ -public class SmsResourceDetails extends BaseOAuth2ProtectedResourceDetails { - - private String phoneNumber; - - private String credential; - - public String getPhoneNumber() { - return phoneNumber; - } - - public void setPhoneNumber(String phoneNumber) { - this.phoneNumber = phoneNumber; - } - - public String getCredential() { - return credential; - } - - public void setCredential(String credential) { - this.credential = credential; - } -} +package com.honvay.cola.auth.client.common.oauth2.sms; + +import org.springframework.security.oauth2.client.resource.BaseOAuth2ProtectedResourceDetails; + +/** + * @author LIQIU + * created on 2018-11-27 + **/ +public class SmsResourceDetails extends BaseOAuth2ProtectedResourceDetails { + + private String phoneNumber; + + private String credential; + + private String token; + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getCredential() { + return credential; + } + + public void setCredential(String credential) { + this.credential = credential; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + +} diff --git a/cola-auth/cola-auth-oauth2/cola-auth-oauth2-base/src/main/java/com/honvay/cola/auth/oauth2/configuration/AuthorizationServerConfiguration.java b/cola-auth/cola-auth-oauth2/cola-auth-oauth2-base/src/main/java/com/honvay/cola/auth/oauth2/configuration/AuthorizationServerConfiguration.java index ff8564f..661c7ea 100644 --- a/cola-auth/cola-auth-oauth2/cola-auth-oauth2-base/src/main/java/com/honvay/cola/auth/oauth2/configuration/AuthorizationServerConfiguration.java +++ b/cola-auth/cola-auth-oauth2/cola-auth-oauth2-base/src/main/java/com/honvay/cola/auth/oauth2/configuration/AuthorizationServerConfiguration.java @@ -13,15 +13,23 @@ import org.springframework.security.oauth2.config.annotation.configurers.ClientD import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; +import org.springframework.security.oauth2.provider.ClientDetailsService; import org.springframework.security.oauth2.provider.CompositeTokenGranter; import org.springframework.security.oauth2.provider.OAuth2Authentication; +import org.springframework.security.oauth2.provider.OAuth2RequestFactory; import org.springframework.security.oauth2.provider.TokenGranter; import org.springframework.security.oauth2.provider.approval.ApprovalStore; import org.springframework.security.oauth2.provider.approval.TokenApprovalStore; +import org.springframework.security.oauth2.provider.client.ClientCredentialsTokenGranter; import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; import org.springframework.security.oauth2.provider.code.AuthorizationCodeServices; +import org.springframework.security.oauth2.provider.code.AuthorizationCodeTokenGranter; import org.springframework.security.oauth2.provider.code.JdbcAuthorizationCodeServices; import org.springframework.security.oauth2.provider.endpoint.RedirectResolver; +import org.springframework.security.oauth2.provider.implicit.ImplicitTokenGranter; +import org.springframework.security.oauth2.provider.password.ResourceOwnerPasswordTokenGranter; +import org.springframework.security.oauth2.provider.refresh.RefreshTokenGranter; +import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore; @@ -29,7 +37,10 @@ import org.springframework.security.oauth2.provider.token.store.redis.RedisToken import com.honvay.cola.auth.oauth2.provider.client.CustomJdbcClientDetailsService; import com.honvay.cola.auth.oauth2.provider.endpoint.DefaultColaRedirectResolver; +import javax.annotation.PostConstruct; import javax.sql.DataSource; + +import java.util.ArrayList; import java.util.List; /** @@ -49,8 +60,13 @@ public class AuthorizationServerConfiguration extends AuthorizationServerConfigu @Autowired private RedisConnectionFactory redisConnectionFactory; - @Autowired(required = false) - private List tokenGranters; + AuthorizationServerEndpointsConfigurer endpoints; + // @Autowired(required = false) +// private List tokenGranters; + +// public AuthorizationServerConfiguration (@Autowired(required = false) List tokenGranters){ +// this.tokenGranters = tokenGranters; +// } @Bean public RedisTemplate oauthRedisTemplate() { @@ -109,7 +125,8 @@ public class AuthorizationServerConfiguration extends AuthorizationServerConfigu .authenticationManager(authenticationManager); endpoints.redirectResolver(redirectResolver()); - this.configGranters(endpoints); + // this.configGranters(endpoints); + this.endpoints = endpoints; } /** @@ -126,10 +143,25 @@ public class AuthorizationServerConfiguration extends AuthorizationServerConfigu * * @param endpoints */ - private void configGranters(AuthorizationServerEndpointsConfigurer endpoints) { - if (tokenGranters != null) { - CompositeTokenGranter compositeTokenGranter = (CompositeTokenGranter) endpoints.getTokenGranter(); - tokenGranters.forEach(compositeTokenGranter::addTokenGranter); + @Configuration + class TokenGranterConfiguration { + + private List tokenGranters; + + TokenGranterConfiguration(@Autowired(required = false) List tokenGranters){ + this.tokenGranters = tokenGranters; } + + @PostConstruct + private void configGranters() { + if (tokenGranters != null) { + List tgs = new ArrayList(); + tgs.add(endpoints.getTokenGranter()); + CompositeTokenGranter compositeTokenGranter = new CompositeTokenGranter(tgs); + tokenGranters.forEach(compositeTokenGranter::addTokenGranter); + endpoints.tokenGranter(compositeTokenGranter); + } + } + } } diff --git a/cola-auth/cola-auth-oauth2/cola-auth-oauth2-sms/pom.xml b/cola-auth/cola-auth-oauth2/cola-auth-oauth2-sms/pom.xml index 8bfd175..b320f35 100644 --- a/cola-auth/cola-auth-oauth2/cola-auth-oauth2-sms/pom.xml +++ b/cola-auth/cola-auth-oauth2/cola-auth-oauth2-sms/pom.xml @@ -21,11 +21,5 @@ spring-security-oauth2-autoconfigure provided - - org.springframework.security.oauth - spring-security-oauth2 - 2.3.4.BUILD-SNAPSHOT - compile - \ No newline at end of file diff --git a/cola-samples/cola-sample-sso/cola-sample-sso-app/src/main/java/com/honvay/cola/sso/smaple/app/AuthController.java b/cola-samples/cola-sample-sso/cola-sample-sso-app/src/main/java/com/honvay/cola/sso/smaple/app/AuthController.java index aecc417..4d866d8 100644 --- a/cola-samples/cola-sample-sso/cola-sample-sso-app/src/main/java/com/honvay/cola/sso/smaple/app/AuthController.java +++ b/cola-samples/cola-sample-sso/cola-sample-sso-app/src/main/java/com/honvay/cola/sso/smaple/app/AuthController.java @@ -1,48 +1,48 @@ -package com.honvay.cola.sso.smaple.app; - -import com.honvay.cola.auth.common.client.app.SsoAuthClient; -import com.honvay.cola.framework.core.protocol.Result; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.security.Principal; - -/** - * @author LIQIU - * created on 2018-11-25 - **/ -@RestController -public class AuthController { - - @Autowired - private SsoAuthClient ssoAuthClient; - - - @GetMapping("/user") - public Principal principal(Principal principal) { - return principal; - } - - @PostMapping("/login") - public OAuth2AccessToken login(String username, String password) { - return ssoAuthClient.login(username, password); - } - - @GetMapping("/logout") - public Result logout() { - return ssoAuthClient.logout(); - } - - @PostMapping("/loginByOpenId") - public OAuth2AccessToken loginByQQ(String openId, String provider) { - return ssoAuthClient.loginByOpenId(openId, provider); - } - - @PostMapping("/loginBySms") - public OAuth2AccessToken loginBySms(String phoneNumber, String verificationCode) { - return ssoAuthClient.loginBySms(phoneNumber, verificationCode); - } -} +package com.honvay.cola.sso.smaple.app; + +import com.honvay.cola.auth.common.client.app.SsoAuthClient; +import com.honvay.cola.framework.core.protocol.Result; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.oauth2.common.OAuth2AccessToken; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.security.Principal; + +/** + * @author LIQIU + * created on 2018-11-25 + **/ +@RestController +public class AuthController { + + @Autowired + private SsoAuthClient ssoAuthClient; + + + @GetMapping("/user") + public Principal principal(Principal principal) { + return principal; + } + + @PostMapping("/login") + public OAuth2AccessToken login(String username, String password) { + return ssoAuthClient.login(username, password); + } + + @GetMapping("/logout") + public Result logout() { + return ssoAuthClient.logout(); + } + + @PostMapping("/loginByOpenId") + public OAuth2AccessToken loginByQQ(String openId, String provider) { + return ssoAuthClient.loginByOpenId(openId, provider); + } + + @PostMapping("/loginBySms") + public OAuth2AccessToken loginBySms(String phoneNumber, String verificationCode, String token) { + return ssoAuthClient.loginBySms(phoneNumber, verificationCode, token); + } +} diff --git a/cola-samples/cola-sample-sso/cola-sample-sso-app/src/main/java/com/honvay/cola/sso/smaple/app/ResourceServerConfiguration.java b/cola-samples/cola-sample-sso/cola-sample-sso-app/src/main/java/com/honvay/cola/sso/smaple/app/ResourceServerConfiguration.java index 061d8a9..f03c233 100644 --- a/cola-samples/cola-sample-sso/cola-sample-sso-app/src/main/java/com/honvay/cola/sso/smaple/app/ResourceServerConfiguration.java +++ b/cola-samples/cola-sample-sso/cola-sample-sso-app/src/main/java/com/honvay/cola/sso/smaple/app/ResourceServerConfiguration.java @@ -1,21 +1,31 @@ -package com.honvay.cola.sso.smaple.app; - -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.builders.WebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; -import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; - -@Configuration -@EnableResourceServer -public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { - - @Override - public void configure(HttpSecurity http) throws Exception { - http.authorizeRequests() - .antMatchers("/login","/loginBySms","loginByOpenId").permitAll() - .anyRequest().authenticated(); - } - +package com.honvay.cola.sso.smaple.app; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; + +@Configuration +@EnableResourceServer +public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { + + + @Value("${security.oauth2.resource.id:'oauth2-resource'}") + private String resource_id; + + @Override + public void configure(ResourceServerSecurityConfigurer resources) throws Exception { + resources.resourceId(resource_id).stateless(false); + super.configure(resources); + } + + @Override + public void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/login","/loginBySms","loginByOpenId").permitAll() + .anyRequest().authenticated(); + } + } \ No newline at end of file -- Gitee From 208c9b8e6d909f56175a65dfa1441421a49c2ceb Mon Sep 17 00:00:00 2001 From: marongjiang Date: Tue, 21 May 2019 18:26:14 +0800 Subject: [PATCH 2/8] =?UTF-8?q?1=E3=80=81=E8=B0=83=E6=95=B4=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=A1=A8=E4=BF=A1=E6=81=AF=20=E5=A2=9E=E5=8A=A0accoun?= =?UTF-8?q?t=5Fexpired=5Ftime=20credentials=5Fexpired=5Ftime=20locked?= =?UTF-8?q?=E4=B8=89=E4=B8=AA=E5=AD=97=E6=AE=B5=202=E3=80=81=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=94=A8=E6=88=B7=E6=9D=83=E9=99=90=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/UserDetailsServiceImpl.java | 35 +++++--- .../auth/core/model/AuthenticatedUser.java | 89 +++++++++++++++++-- .../SmsUserDetailsServiceImpl.java | 35 +++++--- .../SocialUserDetailsServiceImpl.java | 18 ++++ .../com/honvay/cola/uc/api/UserService.java | 11 +-- .../cola/uc/api/enums/UserLockStatus.java | 50 +++++++++++ .../honvay/cola/uc/api/enums/UserStatus.java | 4 - .../cola/uc/api/model/UpdatePasswordDto.java | 4 +- .../com/honvay/cola/uc/api/model/UserDto.java | 26 +++++- .../honvay/cola/uc/provider/domain/User.java | 17 +++- .../uc/provider/impl/UserServiceImpl.java | 16 ++-- .../provider/repository/UserRepository.java | 3 +- sql/cola.sql | 3 + 13 files changed, 261 insertions(+), 50 deletions(-) create mode 100644 cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/enums/UserLockStatus.java diff --git a/cola-auth/cola-auth-base/src/main/java/com/honvay/cola/auth/base/component/UserDetailsServiceImpl.java b/cola-auth/cola-auth-base/src/main/java/com/honvay/cola/auth/base/component/UserDetailsServiceImpl.java index 8223789..ce995c3 100644 --- a/cola-auth/cola-auth-base/src/main/java/com/honvay/cola/auth/base/component/UserDetailsServiceImpl.java +++ b/cola-auth/cola-auth-base/src/main/java/com/honvay/cola/auth/base/component/UserDetailsServiceImpl.java @@ -2,8 +2,12 @@ package com.honvay.cola.auth.base.component; import com.honvay.cola.auth.core.model.AuthenticatedUser; import com.honvay.cola.uc.api.UserService; +import com.honvay.cola.uc.api.enums.UserLockStatus; import com.honvay.cola.uc.api.enums.UserStatus; import com.honvay.cola.uc.api.model.UserDto; + +import java.time.LocalDateTime; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; @@ -32,15 +36,26 @@ public class UserDetailsServiceImpl implements UserDetailsService { } private AuthenticatedUser buildAuthenticatedUser(UserDto user) { - return AuthenticatedUser.builder() - .id(user.getId()) - .username(user.getUsername()) - .password(user.getPassword()) - .phoneNumber(user.getPhoneNumber()) - .email(user.getEmail()) - .avatar(user.getAvatar()) - .locked(UserStatus.LOCKED.getValue().equals(user.getStatus())) - .enable(UserStatus.ACTIVE.getValue().equals(user.getStatus())) - .build(); + AuthenticatedUser authenticatedUser = new AuthenticatedUser(); + authenticatedUser.setId(user.getId()); + authenticatedUser.setUsername(user.getUsername()); + authenticatedUser.setPassword(user.getPassword()); + authenticatedUser.setPhoneNumber(user.getPhoneNumber()); + authenticatedUser.setEmail(user.getEmail()); + authenticatedUser.setAvatar(user.getAvatar()); + authenticatedUser.setLocked(UserLockStatus.LOCKED.getValue().equals(user.getLocked())); + authenticatedUser.setEnable(UserStatus.ACTIVE.getValue().equals(user.getStatus())); + authenticatedUser.setAuthorities(user.getAuthorities()); + + // 账号过期 + if (null != user.getAccountExpiredTime() && LocalDateTime.now().isAfter(user.getAccountExpiredTime())) { + authenticatedUser.setAccountNonExpired(false); + } + + // 凭证过期、密码过期 + if (null != user.getCredentialsExpiredTime() && LocalDateTime.now().isAfter(user.getCredentialsExpiredTime())) { + authenticatedUser.setCredentialsNonExpired(false); + } + return authenticatedUser; } } diff --git a/cola-auth/cola-auth-core/src/main/java/com/honvay/cola/auth/core/model/AuthenticatedUser.java b/cola-auth/cola-auth-core/src/main/java/com/honvay/cola/auth/core/model/AuthenticatedUser.java index e450675..ce5d157 100644 --- a/cola-auth/cola-auth-core/src/main/java/com/honvay/cola/auth/core/model/AuthenticatedUser.java +++ b/cola-auth/cola-auth-core/src/main/java/com/honvay/cola/auth/core/model/AuthenticatedUser.java @@ -1,26 +1,26 @@ package com.honvay.cola.auth.core.model; import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.security.core.CredentialsContainer; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; +import java.io.Serializable; import java.util.Collection; /** * @author LIQIU * created on 2018-11-16 **/ -@Data -@Builder @AllArgsConstructor @NoArgsConstructor public class AuthenticatedUser implements UserDetails, CredentialsContainer { - private Integer id; + private static final long serialVersionUID = -4307906491659815895L; + + + private Serializable id; /** * 用户名 @@ -50,6 +50,12 @@ public class AuthenticatedUser implements UserDetails, CredentialsContainer { private boolean locked; private boolean enable; + + private boolean accountNonExpired = true; + private boolean credentialsNonExpired = true; + + private Collection authorities; + @Override public void eraseCredentials() { @@ -58,7 +64,7 @@ public class AuthenticatedUser implements UserDetails, CredentialsContainer { @Override public Collection getAuthorities() { - return null; + return authorities; } @Override @@ -73,7 +79,7 @@ public class AuthenticatedUser implements UserDetails, CredentialsContainer { @Override public boolean isAccountNonExpired() { - return true; + return accountNonExpired; } @Override @@ -83,7 +89,7 @@ public class AuthenticatedUser implements UserDetails, CredentialsContainer { @Override public boolean isCredentialsNonExpired() { - return true; + return credentialsNonExpired; } @Override @@ -91,5 +97,72 @@ public class AuthenticatedUser implements UserDetails, CredentialsContainer { return enable; } + public Serializable getId() { + return id; + } + + public void setId(Serializable id) { + this.id = id; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public boolean isLocked() { + return locked; + } + + public void setLocked(boolean locked) { + this.locked = locked; + } + + public boolean isEnable() { + return enable; + } + + public void setEnable(boolean enable) { + this.enable = enable; + } + public void setUsername(String username) { + this.username = username; + } + + public void setPassword(String password) { + this.password = password; + } + + public void setAccountNonExpired(boolean accountNonExpired) { + this.accountNonExpired = accountNonExpired; + } + + public void setCredentialsNonExpired(boolean credentialsNonExpired) { + this.credentialsNonExpired = credentialsNonExpired; + } + + public void setAuthorities(Collection authorities) { + this.authorities = authorities; + } + } diff --git a/cola-auth/cola-auth-sms/src/main/java/com/honvay/cola/auth/web/sms/userdetails/SmsUserDetailsServiceImpl.java b/cola-auth/cola-auth-sms/src/main/java/com/honvay/cola/auth/web/sms/userdetails/SmsUserDetailsServiceImpl.java index 72a723a..10f3130 100644 --- a/cola-auth/cola-auth-sms/src/main/java/com/honvay/cola/auth/web/sms/userdetails/SmsUserDetailsServiceImpl.java +++ b/cola-auth/cola-auth-sms/src/main/java/com/honvay/cola/auth/web/sms/userdetails/SmsUserDetailsServiceImpl.java @@ -3,8 +3,12 @@ package com.honvay.cola.auth.web.sms.userdetails; import com.honvay.cola.auth.core.model.AuthenticatedUser; import com.honvay.cola.auth.web.sms.SmsUserDetailsService; import com.honvay.cola.uc.api.UserService; +import com.honvay.cola.uc.api.enums.UserLockStatus; import com.honvay.cola.uc.api.enums.UserStatus; import com.honvay.cola.uc.api.model.UserDto; + +import java.time.LocalDateTime; + import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; @@ -27,17 +31,28 @@ public class SmsUserDetailsServiceImpl implements SmsUserDetailsService { if (userDto == null) { throw new UsernameNotFoundException("User " + phoneNumber + " can not be found"); } + + + AuthenticatedUser authenticatedUser = new AuthenticatedUser(); + authenticatedUser.setId(userDto.getId()); + authenticatedUser.setUsername(userDto.getUsername()); + authenticatedUser.setPassword(userDto.getPassword()); + authenticatedUser.setPhoneNumber(userDto.getPhoneNumber()); + authenticatedUser.setEmail(userDto.getEmail()); + authenticatedUser.setAvatar(userDto.getAvatar()); + authenticatedUser.setEnable(UserStatus.ACTIVE.getValue().equals(userDto.getStatus())); + authenticatedUser.setLocked(UserLockStatus.LOCKED.getValue().equals(userDto.getLocked())); + authenticatedUser.setAuthorities(userDto.getAuthorities()); + + // 账号过期 + if (null != userDto.getAccountExpiredTime() && LocalDateTime.now().isAfter(userDto.getAccountExpiredTime())) { + authenticatedUser.setAccountNonExpired(false); + } + + // 凭证不过期 + authenticatedUser.setCredentialsNonExpired(true); - return AuthenticatedUser.builder() - .id(userDto.getId()) - .username(userDto.getUsername()) - .password(userDto.getPassword()) - .phoneNumber(userDto.getPhoneNumber()) - .email(userDto.getEmail()) - .avatar(userDto.getAvatar()) - .locked(UserStatus.LOCKED.getValue().equals(userDto.getStatus())) - .enable(UserStatus.ACTIVE.getValue().equals(userDto.getStatus())) - .build(); + return authenticatedUser; } diff --git a/cola-auth/cola-auth-social/cola-auth-social-base/src/main/java/com/honvay/cola/auth/social/core/userdetails/SocialUserDetailsServiceImpl.java b/cola-auth/cola-auth-social/cola-auth-social-base/src/main/java/com/honvay/cola/auth/social/core/userdetails/SocialUserDetailsServiceImpl.java index 610f1b8..8832d13 100644 --- a/cola-auth/cola-auth-social/cola-auth-social-base/src/main/java/com/honvay/cola/auth/social/core/userdetails/SocialUserDetailsServiceImpl.java +++ b/cola-auth/cola-auth-social/cola-auth-social-base/src/main/java/com/honvay/cola/auth/social/core/userdetails/SocialUserDetailsServiceImpl.java @@ -2,7 +2,12 @@ package com.honvay.cola.auth.social.core.userdetails; import com.honvay.cola.auth.social.core.SocialAuthenticatedUser; import com.honvay.cola.uc.api.UserService; +import com.honvay.cola.uc.api.enums.UserLockStatus; +import com.honvay.cola.uc.api.enums.UserStatus; import com.honvay.cola.uc.api.model.UserDto; + +import java.time.LocalDateTime; + import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.social.security.SocialUserDetails; import org.springframework.social.security.SocialUserDetailsService; @@ -38,6 +43,19 @@ public class SocialUserDetailsServiceImpl implements SocialUserDetailsService { socialSsoUser.setEmail(user.getEmail()); socialSsoUser.setPhoneNumber(user.getPhoneNumber()); socialSsoUser.setAvatar(user.getAvatar()); + + + socialSsoUser.setLocked(UserLockStatus.LOCKED.getValue().equals(user.getLocked())); + socialSsoUser.setEnable(UserStatus.ACTIVE.getValue().equals(user.getStatus())); + socialSsoUser.setAuthorities(user.getAuthorities()); + + // 账号过期 + if (null != user.getAccountExpiredTime() && LocalDateTime.now().isAfter(user.getAccountExpiredTime())) { + socialSsoUser.setAccountNonExpired(false); + } + + // 凭证过期 设置凭证不过期 + socialSsoUser.setCredentialsNonExpired(true); return socialSsoUser; } diff --git a/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/UserService.java b/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/UserService.java index 0e16d0f..c3c85cd 100644 --- a/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/UserService.java +++ b/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/UserService.java @@ -1,10 +1,11 @@ package com.honvay.cola.uc.api; +import java.io.Serializable; + import com.honvay.cola.uc.api.model.UpdatePasswordDto; import com.honvay.cola.uc.api.model.UserAddDto; import com.honvay.cola.uc.api.model.UserDto; -import java.util.Optional; /** * @author LIQIU @@ -23,14 +24,14 @@ public interface UserService { * * @param id 用户ID */ - void lock(Integer id); + void lock(Serializable id); /** * 解锁用户 * * @param id 用户ID */ - void unlock(Integer id); + void unlock(Serializable id); /** * 添加用户 @@ -62,7 +63,7 @@ public interface UserService { * @param id 用户ID * @return 用户信息 */ - UserDto getById(Integer id); + UserDto getById(Serializable id); /** * 处理登录成功 @@ -87,5 +88,5 @@ public interface UserService { * @param id 用户ID * @param phoneNumber 手机号 */ - void updatePhoneNumber(Integer id, String phoneNumber); + void updatePhoneNumber(Serializable id, String phoneNumber); } diff --git a/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/enums/UserLockStatus.java b/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/enums/UserLockStatus.java new file mode 100644 index 0000000..003e8cb --- /dev/null +++ b/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/enums/UserLockStatus.java @@ -0,0 +1,50 @@ +package com.honvay.cola.uc.api.enums; + +/** + * 用户账号锁定状态枚举 + * + * @author LIQIU + * created on 2018-11-16 + **/ +public enum UserLockStatus { + + /** + * 正常状态 + */ + UNLOCKED("正常", 0), + /** + * 锁定状态 + */ + LOCKED("锁定", 1); + + UserLockStatus(String name, Integer value) { + this.name = name; + this.value = value; + } + + /** + * 状态名称 + */ + private String name; + + /** + * 状态值 + */ + private Integer value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getValue() { + return value; + } + + public void setValue(Integer value) { + this.value = value; + } +} diff --git a/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/enums/UserStatus.java b/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/enums/UserStatus.java index a254059..345fccd 100644 --- a/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/enums/UserStatus.java +++ b/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/enums/UserStatus.java @@ -12,10 +12,6 @@ public enum UserStatus { * 正常状态 */ ACTIVE("正常", 1), - /** - * 锁定状态 - */ - LOCKED("锁定", 2), /** * 失效状态 */ diff --git a/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/model/UpdatePasswordDto.java b/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/model/UpdatePasswordDto.java index 485d295..6383db4 100644 --- a/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/model/UpdatePasswordDto.java +++ b/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/model/UpdatePasswordDto.java @@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.io.Serializable; + import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Size; @@ -16,7 +18,7 @@ import javax.validation.constraints.Size; public class UpdatePasswordDto { @ApiModelProperty(name = "用户ID", required = true) - private Integer id; + private Serializable id; @NotEmpty(message = "原密码不能为空") @ApiModelProperty(name = "原密码", required = true) diff --git a/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/model/UserDto.java b/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/model/UserDto.java index b94ce2e..f6253ef 100644 --- a/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/model/UserDto.java +++ b/cola-user/cola-user-api/src/main/java/com/honvay/cola/uc/api/model/UserDto.java @@ -6,7 +6,10 @@ import lombok.Data; import lombok.NoArgsConstructor; import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Collection; import java.util.Date; /** @@ -22,7 +25,7 @@ public class UserDto { /** * ID */ - private Integer id; + private Serializable id; /** * 用户名 @@ -78,8 +81,25 @@ public class UserDto { private Integer loginFailTimes; /** - * 状态: 1、正常 2、锁定 3、失效 + * 状态: 1、正常 3、失效 */ private Integer status; + + + /** + * 锁定状态 + * 0、未锁定 + * 1、锁定 + */ + private Integer locked; + + private LocalDateTime accountExpiredTime; + + private LocalDateTime credentialsExpiredTime; + + /** + * private Collection authorities; + */ + private Collection authorities; } diff --git a/cola-user/cola-user-provider/src/main/java/com/honvay/cola/uc/provider/domain/User.java b/cola-user/cola-user-provider/src/main/java/com/honvay/cola/uc/provider/domain/User.java index 9f252ba..27eba06 100644 --- a/cola-user/cola-user-provider/src/main/java/com/honvay/cola/uc/provider/domain/User.java +++ b/cola-user/cola-user-provider/src/main/java/com/honvay/cola/uc/provider/domain/User.java @@ -8,6 +8,8 @@ import lombok.NoArgsConstructor; import javax.persistence.*; import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; + +import java.time.LocalDateTime; import java.util.Date; /** @@ -31,7 +33,7 @@ public class User { */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer id; + private String id; /** * 用户名 @@ -104,4 +106,17 @@ public class User { */ @Column(length = 2) private Integer status; + + /** + * 锁定状态 + * 0、未锁定 + * 1、锁定 + */ + @Column(length = 2) + private Integer locked; + + + private LocalDateTime accountExpiredTime; + + private LocalDateTime credentialsExpiredTime; } diff --git a/cola-user/cola-user-provider/src/main/java/com/honvay/cola/uc/provider/impl/UserServiceImpl.java b/cola-user/cola-user-provider/src/main/java/com/honvay/cola/uc/provider/impl/UserServiceImpl.java index 12a1065..316d619 100644 --- a/cola-user/cola-user-provider/src/main/java/com/honvay/cola/uc/provider/impl/UserServiceImpl.java +++ b/cola-user/cola-user-provider/src/main/java/com/honvay/cola/uc/provider/impl/UserServiceImpl.java @@ -6,6 +6,7 @@ import com.honvay.cola.sc.api.PasswordStrategy; import com.honvay.cola.sc.api.exception.PasswordInvalidException; import com.honvay.cola.uc.api.UserService; import com.honvay.cola.uc.api.enums.UserErrorMessage; +import com.honvay.cola.uc.api.enums.UserLockStatus; import com.honvay.cola.uc.api.enums.UserStatus; import com.honvay.cola.uc.api.model.UpdatePasswordDto; import com.honvay.cola.uc.api.model.UserAddDto; @@ -22,6 +23,7 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import java.io.Serializable; import java.util.Date; /** @@ -62,15 +64,15 @@ public class UserServiceImpl implements UserService, ApplicationEventPublisherAw } @Override - public void lock(Integer id) { + public void lock(Serializable id) { User user = userRepository.findById(id).orElseThrow(() -> new ServiceException(UserErrorMessage.USER_NOT_EXISTS)); - ServiceAssert.isTrue(user.getStatus().equals(UserStatus.LOCKED.getValue()), UserErrorMessage.USER_STATUS_ILLEGAL); - user.setStatus(UserStatus.LOCKED.getValue()); + ServiceAssert.isTrue(user.getStatus().equals(UserLockStatus.LOCKED.getValue()), UserErrorMessage.USER_STATUS_ILLEGAL); + user.setLocked(UserLockStatus.LOCKED.getValue()); this.userRepository.save(user); } @Override - public void unlock(Integer id) { + public void unlock(Serializable id) { User user = userRepository.findById(id).orElseThrow(() -> new ServiceException(UserErrorMessage.USER_NOT_EXISTS)); user.setStatus(UserStatus.ACTIVE.getValue()); this.userRepository.save(user); @@ -140,7 +142,7 @@ public class UserServiceImpl implements UserService, ApplicationEventPublisherAw loginFailTimes++; //超过限定次数则锁定用户 if (loginFailTimes >= loginFailTimesToLock) { - user.setStatus(UserStatus.LOCKED.getValue()); + user.setLocked(UserLockStatus.LOCKED.getValue()); user.setLoginFailTimes(0); } else { user.setLoginFailTimes(loginFailTimes); @@ -150,7 +152,7 @@ public class UserServiceImpl implements UserService, ApplicationEventPublisherAw } @Override - public UserDto getById(Integer id) { + public UserDto getById(Serializable id) { return this.userRepository.findById(id).map(user -> { UserDto userDto = new UserDto(); BeanUtils.copyProperties(user, userDto); @@ -179,7 +181,7 @@ public class UserServiceImpl implements UserService, ApplicationEventPublisherAw } @Override - public void updatePhoneNumber(Integer id, String phoneNumber) { + public void updatePhoneNumber(Serializable id, String phoneNumber) { User user = this.userRepository.findById(id).orElseThrow(() -> new ServiceException(UserErrorMessage.USER_NOT_EXISTS)); user.setPhoneNumber(phoneNumber); this.userRepository.save(user); diff --git a/cola-user/cola-user-provider/src/main/java/com/honvay/cola/uc/provider/repository/UserRepository.java b/cola-user/cola-user-provider/src/main/java/com/honvay/cola/uc/provider/repository/UserRepository.java index 7a0b469..a53dddb 100644 --- a/cola-user/cola-user-provider/src/main/java/com/honvay/cola/uc/provider/repository/UserRepository.java +++ b/cola-user/cola-user-provider/src/main/java/com/honvay/cola/uc/provider/repository/UserRepository.java @@ -3,13 +3,14 @@ package com.honvay.cola.uc.provider.repository; import com.honvay.cola.uc.provider.domain.User; import org.springframework.data.jpa.repository.JpaRepository; +import java.io.Serializable; import java.util.Optional; /** * @author LIQIU * created on 2018-11-16 **/ -public interface UserRepository extends JpaRepository { +public interface UserRepository extends JpaRepository { /** * 通过用户名查找用户 diff --git a/sql/cola.sql b/sql/cola.sql index 4f9bec5..2e4a271 100644 --- a/sql/cola.sql +++ b/sql/cola.sql @@ -34,8 +34,11 @@ CREATE TABLE `cola_user` ( `password` varchar(100) NOT NULL, `phone_number` varchar(100) DEFAULT NULL, `status` varchar(2) DEFAULT NULL, + `locked` varchar(2) DEFAULT NULL, `username` varchar(100) NOT NULL, `gender` varchar(2) DEFAULT NULL, + `account_expired_time` DATETIME NULL, + `credentials_expired_time` DATETIME NULL, PRIMARY KEY (`id`), UNIQUE KEY `uni_ias_user_username` (`username`), UNIQUE KEY `uni_ias_user_email` (`email`), -- Gitee From 80e49e9a5799dcc4a1d0a0d7ed08ea3a19bec5aa Mon Sep 17 00:00:00 2001 From: marongjiang Date: Thu, 23 May 2019 14:50:56 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/templates/error.html | 2 +- .../src/main/resources/templates/form.html | 6 +++--- .../src/main/resources/templates/index.html | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cola-samples/cola-sample-sso/cola-sample-sso-server/src/main/resources/templates/error.html b/cola-samples/cola-sample-sso/cola-sample-sso-server/src/main/resources/templates/error.html index 7c7593a..81ffca4 100644 --- a/cola-samples/cola-sample-sso/cola-sample-sso-server/src/main/resources/templates/error.html +++ b/cola-samples/cola-sample-sso/cola-sample-sso-server/src/main/resources/templates/error.html @@ -3,7 +3,7 @@ 系统错误 - +
diff --git a/cola-samples/cola-sample-sso/cola-sample-sso-server/src/main/resources/templates/form.html b/cola-samples/cola-sample-sso/cola-sample-sso-server/src/main/resources/templates/form.html index 8f4638b..8ba7594 100644 --- a/cola-samples/cola-sample-sso/cola-sample-sso-server/src/main/resources/templates/form.html +++ b/cola-samples/cola-sample-sso/cola-sample-sso-server/src/main/resources/templates/form.html @@ -3,9 +3,9 @@ Client edit/add - - - + + +