From dd2d613f45de668ea79eea35a21c67d6b435634c Mon Sep 17 00:00:00 2001 From: lishengzhao Date: Tue, 26 May 2015 15:45:50 +0800 Subject: [PATCH] 00019 Register a new client_details --- .../domain/dto/OauthClientDetailsDto.java | 27 +++++++ .../wdcy/domain/oauth/OauthClientDetails.java | 55 ++++++++++++++ .../cc/wdcy/domain/oauth/OauthRepository.java | 2 + .../java/cc/wdcy/service/OauthService.java | 2 + .../wdcy/service/impl/OauthServiceImpl.java | 8 +- .../controller/ClientDetailsController.java | 20 +++++ .../oauth/OauthClientDetailsDtoValidator.java | 73 +++++++++++++++++++ .../infrastructure/mybatis/OauthMapper.xml | 9 +++ .../jsp/clientdetails/register_client.jsp | 9 +++ .../mybatis/OauthRepositoryMyBatisTest.java | 17 +++++ 10 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cc/wdcy/web/oauth/OauthClientDetailsDtoValidator.java diff --git a/src/main/java/cc/wdcy/domain/dto/OauthClientDetailsDto.java b/src/main/java/cc/wdcy/domain/dto/OauthClientDetailsDto.java index 4fbed70..7d3b84b 100644 --- a/src/main/java/cc/wdcy/domain/dto/OauthClientDetailsDto.java +++ b/src/main/java/cc/wdcy/domain/dto/OauthClientDetailsDto.java @@ -2,6 +2,7 @@ package cc.wdcy.domain.dto; import cc.wdcy.domain.oauth.OauthClientDetails; import cc.wdcy.infrastructure.DateUtils; +import org.apache.commons.lang.StringUtils; import java.io.Serializable; import java.util.ArrayList; @@ -196,4 +197,30 @@ public class OauthClientDetailsDto implements Serializable { } + public OauthClientDetails createDomain() { + OauthClientDetails clientDetails = new OauthClientDetails() + .clientId(clientId) + .clientSecret(clientSecret) + .resourceIds(resourceIds) + .authorizedGrantTypes(authorizedGrantTypes) + .scope(scope); + + if (StringUtils.isNotEmpty(webServerRedirectUri)) { + clientDetails.webServerRedirectUri(webServerRedirectUri); + } + + if (StringUtils.isNotEmpty(authorities)) { + clientDetails.authorities(authorities); + } + + clientDetails.accessTokenValidity(accessTokenValidity) + .refreshTokenValidity(refreshTokenValidity) + .trusted(trusted); + + if (StringUtils.isNotEmpty(additionalInformation)) { + clientDetails.additionalInformation(additionalInformation); + } + + return clientDetails; + } } \ No newline at end of file diff --git a/src/main/java/cc/wdcy/domain/oauth/OauthClientDetails.java b/src/main/java/cc/wdcy/domain/oauth/OauthClientDetails.java index 80fc61c..d1a235e 100644 --- a/src/main/java/cc/wdcy/domain/oauth/OauthClientDetails.java +++ b/src/main/java/cc/wdcy/domain/oauth/OauthClientDetails.java @@ -141,4 +141,59 @@ public class OauthClientDetails implements Serializable { sb.append('}'); return sb.toString(); } + + public OauthClientDetails clientId(String clientId) { + this.clientId = clientId; + return this; + } + + public OauthClientDetails clientSecret(String clientSecret) { + this.clientSecret = clientSecret; + return this; + } + + public OauthClientDetails resourceIds(String resourceIds) { + this.resourceIds = resourceIds; + return this; + } + + public OauthClientDetails authorizedGrantTypes(String authorizedGrantTypes) { + this.authorizedGrantTypes = authorizedGrantTypes; + return this; + } + + public OauthClientDetails scope(String scope) { + this.scope = scope; + return this; + } + + public OauthClientDetails webServerRedirectUri(String webServerRedirectUri) { + this.webServerRedirectUri = webServerRedirectUri; + return this; + } + + public OauthClientDetails authorities(String authorities) { + this.authorities = authorities; + return this; + } + + public OauthClientDetails accessTokenValidity(Integer accessTokenValidity) { + this.accessTokenValidity = accessTokenValidity; + return this; + } + + public OauthClientDetails refreshTokenValidity(Integer refreshTokenValidity) { + this.refreshTokenValidity = refreshTokenValidity; + return this; + } + + public OauthClientDetails trusted(boolean trusted) { + this.trusted = trusted; + return this; + } + + public OauthClientDetails additionalInformation(String additionalInformation) { + this.additionalInformation = additionalInformation; + return this; + } } \ No newline at end of file diff --git a/src/main/java/cc/wdcy/domain/oauth/OauthRepository.java b/src/main/java/cc/wdcy/domain/oauth/OauthRepository.java index 8f4a844..ae6cff7 100644 --- a/src/main/java/cc/wdcy/domain/oauth/OauthRepository.java +++ b/src/main/java/cc/wdcy/domain/oauth/OauthRepository.java @@ -15,4 +15,6 @@ public interface OauthRepository extends Repository { List findAllOauthClientDetails(); void updateOauthClientDetailsArchive(@Param("clientId") String clientId, @Param("archive") boolean archive); + + void saveOauthClientDetails(OauthClientDetails clientDetails); } \ No newline at end of file diff --git a/src/main/java/cc/wdcy/service/OauthService.java b/src/main/java/cc/wdcy/service/OauthService.java index 675f30b..61e2d38 100644 --- a/src/main/java/cc/wdcy/service/OauthService.java +++ b/src/main/java/cc/wdcy/service/OauthService.java @@ -18,4 +18,6 @@ public interface OauthService { void archiveOauthClientDetails(String clientId); OauthClientDetailsDto loadOauthClientDetailsDto(String clientId); + + void registerClientDetails(OauthClientDetailsDto formDto); } \ No newline at end of file diff --git a/src/main/java/cc/wdcy/service/impl/OauthServiceImpl.java b/src/main/java/cc/wdcy/service/impl/OauthServiceImpl.java index 6101efb..f81a9c4 100644 --- a/src/main/java/cc/wdcy/service/impl/OauthServiceImpl.java +++ b/src/main/java/cc/wdcy/service/impl/OauthServiceImpl.java @@ -37,6 +37,12 @@ public class OauthServiceImpl implements OauthService { @Override public OauthClientDetailsDto loadOauthClientDetailsDto(String clientId) { final OauthClientDetails oauthClientDetails = oauthRepository.findOauthClientDetails(clientId); - return new OauthClientDetailsDto(oauthClientDetails); + return oauthClientDetails != null ? new OauthClientDetailsDto(oauthClientDetails) : null; + } + + @Override + public void registerClientDetails(OauthClientDetailsDto formDto) { + OauthClientDetails clientDetails = formDto.createDomain(); + oauthRepository.saveOauthClientDetails(clientDetails); } } \ No newline at end of file diff --git a/src/main/java/cc/wdcy/web/controller/ClientDetailsController.java b/src/main/java/cc/wdcy/web/controller/ClientDetailsController.java index 977a714..75f562f 100644 --- a/src/main/java/cc/wdcy/web/controller/ClientDetailsController.java +++ b/src/main/java/cc/wdcy/web/controller/ClientDetailsController.java @@ -2,9 +2,12 @@ package cc.wdcy.web.controller; import cc.wdcy.domain.dto.OauthClientDetailsDto; import cc.wdcy.service.OauthService; +import cc.wdcy.web.oauth.OauthClientDetailsDtoValidator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -23,6 +26,9 @@ public class ClientDetailsController { @Autowired private OauthService oauthService; + @Autowired + private OauthClientDetailsDtoValidator clientDetailsDtoValidator; + @RequestMapping("client_details") public String clientDetails(Model model) { @@ -62,4 +68,18 @@ public class ClientDetailsController { } + /* + * Submit register client + * */ + @RequestMapping(value = "register_client", method = RequestMethod.POST) + public String submitRegisterClient(@ModelAttribute("formDto") OauthClientDetailsDto formDto, BindingResult result) { + clientDetailsDtoValidator.validate(formDto, result); + if (result.hasErrors()) { + return "clientdetails/register_client"; + } + oauthService.registerClientDetails(formDto); + return "redirect:client_details"; + } + + } \ No newline at end of file diff --git a/src/main/java/cc/wdcy/web/oauth/OauthClientDetailsDtoValidator.java b/src/main/java/cc/wdcy/web/oauth/OauthClientDetailsDtoValidator.java new file mode 100644 index 0000000..f3f5078 --- /dev/null +++ b/src/main/java/cc/wdcy/web/oauth/OauthClientDetailsDtoValidator.java @@ -0,0 +1,73 @@ +package cc.wdcy.web.oauth; + +import cc.wdcy.domain.dto.OauthClientDetailsDto; +import cc.wdcy.service.OauthService; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.validation.Errors; +import org.springframework.validation.Validator; + +/** + * @author Shengzhao Li + */ +@Component +public class OauthClientDetailsDtoValidator implements Validator { + + + @Autowired + private OauthService oauthService; + + @Override + public boolean supports(Class clazz) { + return OauthClientDetailsDto.class.equals(clazz); + } + + @Override + public void validate(Object target, Errors errors) { + OauthClientDetailsDto clientDetailsDto = (OauthClientDetailsDto) target; + + validateClientId(clientDetailsDto, errors); + validateClientSecret(clientDetailsDto, errors); + + validateGrantTypes(clientDetailsDto, errors); + } + + private void validateGrantTypes(OauthClientDetailsDto clientDetailsDto, Errors errors) { + final String grantTypes = clientDetailsDto.getAuthorizedGrantTypes(); + if (StringUtils.isEmpty(grantTypes)) { + errors.rejectValue("authorizedGrantTypes", null, "grant_type(s) is required"); + } + } + + private void validateClientSecret(OauthClientDetailsDto clientDetailsDto, Errors errors) { + final String clientSecret = clientDetailsDto.getClientSecret(); + if (StringUtils.isEmpty(clientSecret)) { + errors.rejectValue("clientSecret", null, "client_secret is required"); + return; + } + + if (clientSecret.length() < 8) { + errors.rejectValue("clientSecret", null, "client_secret 长度至少8位"); + } + } + + private void validateClientId(OauthClientDetailsDto clientDetailsDto, Errors errors) { + final String clientId = clientDetailsDto.getClientId(); + if (StringUtils.isEmpty(clientId)) { + errors.rejectValue("clientId", null, "client_id is required"); + return; + } + + if (clientId.length() < 5) { + errors.rejectValue("clientId", null, "client_id 长度至少5位"); + return; + } + + OauthClientDetailsDto clientDetailsDto1 = oauthService.loadOauthClientDetailsDto(clientId); + if (clientDetailsDto1 != null) { + errors.rejectValue("clientId", null, "client_id [" + clientId + "] 已存在"); + } + + } +} \ No newline at end of file diff --git a/src/main/resources/cc/wdcy/infrastructure/mybatis/OauthMapper.xml b/src/main/resources/cc/wdcy/infrastructure/mybatis/OauthMapper.xml index c6da330..bb78afb 100644 --- a/src/main/resources/cc/wdcy/infrastructure/mybatis/OauthMapper.xml +++ b/src/main/resources/cc/wdcy/infrastructure/mybatis/OauthMapper.xml @@ -39,4 +39,13 @@ + + insert into oauth_client_details(client_id,resource_ids,client_secret,scope,authorized_grant_types,web_server_redirect_uri, + authorities,access_token_validity,refresh_token_validity,additional_information,trusted) + values + (#{clientId},#{resourceIds},#{clientSecret},#{scope},#{authorizedGrantTypes}, #{webServerRedirectUri}, + #{authorities},#{accessTokenValidity},#{refreshTokenValidity},#{additionalInformation}, #{trusted}) + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/clientdetails/register_client.jsp b/src/main/webapp/WEB-INF/jsp/clientdetails/register_client.jsp index 29343ee..e7729c7 100644 --- a/src/main/webapp/WEB-INF/jsp/clientdetails/register_client.jsp +++ b/src/main/webapp/WEB-INF/jsp/clientdetails/register_client.jsp @@ -195,6 +195,15 @@ + +
+
+
+ +
+
+ +
diff --git a/src/test/java/cc/wdcy/infrastructure/mybatis/OauthRepositoryMyBatisTest.java b/src/test/java/cc/wdcy/infrastructure/mybatis/OauthRepositoryMyBatisTest.java index 4c1659a..a9680ba 100644 --- a/src/test/java/cc/wdcy/infrastructure/mybatis/OauthRepositoryMyBatisTest.java +++ b/src/test/java/cc/wdcy/infrastructure/mybatis/OauthRepositoryMyBatisTest.java @@ -2,6 +2,7 @@ package cc.wdcy.infrastructure.mybatis; import cc.wdcy.domain.oauth.OauthClientDetails; import cc.wdcy.domain.oauth.OauthRepository; +import cc.wdcy.domain.shared.GuidGenerator; import cc.wdcy.infrastructure.AbstractRepositoryTest; import org.springframework.beans.factory.annotation.Autowired; import org.testng.annotations.Test; @@ -27,6 +28,22 @@ public class OauthRepositoryMyBatisTest extends AbstractRepositoryTest { } + + @Test + public void saveOauthClientDetails() { + + final String clientId = GuidGenerator.generate(); + + OauthClientDetails clientDetails = new OauthClientDetails().clientId(clientId); + oauthRepositoryMyBatis.saveOauthClientDetails(clientDetails); + + final OauthClientDetails oauthClientDetails = oauthRepositoryMyBatis.findOauthClientDetails(clientId); + assertNotNull(oauthClientDetails); + assertNotNull(oauthClientDetails.clientId()); + assertNull(oauthClientDetails.clientSecret()); + + } + @Test public void findAllOauthClientDetails() { final List allOauthClientDetails = oauthRepositoryMyBatis.findAllOauthClientDetails();