From d04bd2036fe107ef9e1bf175c500925a7b6cc194 Mon Sep 17 00:00:00 2001 From: sz_ids Date: Sun, 14 Oct 2018 22:50:27 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84service=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0business=E5=B1=82=EF=BC=9Bcontext=20?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=B1=95=E7=A4=BA=E5=B7=B2=E7=BB=8F=E7=99=BB?= =?UTF-8?q?=E5=BD=95=20=E7=9A=84=E7=94=A8=E6=88=B7=E5=90=8D=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=94=A8=E6=88=B7=E5=90=8E=E5=8A=A0=E5=85=A5=E7=BC=93?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sos/infrastructure/CacheConstants.java | 15 +++---- .../sos/infrastructure/SOSCacheUtils.java | 41 ++++++++++++++++++ .../business/CurrentUserJsonDtoLoader.java | 40 +++++++++++++++++ .../business/OauthUserJsonDtoLoader.java | 35 +++++++++++++++ .../sos/service/business/UserFormSaver.java | 43 +++++++++++++++++++ .../sos/service/impl/UserServiceImpl.java | 35 +++------------ .../monkeyk/sos/web/context/BeanProvider.java | 39 +++++++++++++++++ .../web/context/SOSContextLoaderListener.java | 28 ++++++++++++ src/main/webapp/WEB-INF/web.xml | 4 +- src/main/webapp/index.jsp | 20 ++++++--- 10 files changed, 255 insertions(+), 45 deletions(-) create mode 100644 src/main/java/com/monkeyk/sos/infrastructure/SOSCacheUtils.java create mode 100644 src/main/java/com/monkeyk/sos/service/business/CurrentUserJsonDtoLoader.java create mode 100644 src/main/java/com/monkeyk/sos/service/business/OauthUserJsonDtoLoader.java create mode 100644 src/main/java/com/monkeyk/sos/service/business/UserFormSaver.java create mode 100644 src/main/java/com/monkeyk/sos/web/context/BeanProvider.java create mode 100644 src/main/java/com/monkeyk/sos/web/context/SOSContextLoaderListener.java diff --git a/src/main/java/com/monkeyk/sos/infrastructure/CacheConstants.java b/src/main/java/com/monkeyk/sos/infrastructure/CacheConstants.java index 3fe0f37..59b0f89 100644 --- a/src/main/java/com/monkeyk/sos/infrastructure/CacheConstants.java +++ b/src/main/java/com/monkeyk/sos/infrastructure/CacheConstants.java @@ -9,35 +9,32 @@ package com.monkeyk.sos.infrastructure; * * @author Shengzhao Li */ -public abstract class CacheConstants { +public interface CacheConstants { /** * client Details Cache, key is clientId */ - public static final String CLIENT_DETAILS_CACHE = "clientDetailsCache"; + String CLIENT_DETAILS_CACHE = "clientDetailsCache"; /** * access Token Cache, key is token */ - public static final String ACCESS_TOKEN_CACHE = "accessTokenCache"; + String ACCESS_TOKEN_CACHE = "accessTokenCache"; /** * refresh Token Cache, key is token */ - public static final String REFRESH_TOKEN_CACHE = "refreshTokenCache"; + String REFRESH_TOKEN_CACHE = "refreshTokenCache"; /** * authorization Code Cache, key is code */ - public static final String AUTHORIZATION_CODE_CACHE = "authorizationCodeCache"; + String AUTHORIZATION_CODE_CACHE = "authorizationCodeCache"; /** * user Cache, key is username */ - public static final String USER_CACHE = "userCache"; + String USER_CACHE = "userCache"; - private CacheConstants() { - } - } diff --git a/src/main/java/com/monkeyk/sos/infrastructure/SOSCacheUtils.java b/src/main/java/com/monkeyk/sos/infrastructure/SOSCacheUtils.java new file mode 100644 index 0000000..27073b1 --- /dev/null +++ b/src/main/java/com/monkeyk/sos/infrastructure/SOSCacheUtils.java @@ -0,0 +1,41 @@ +package com.monkeyk.sos.infrastructure; + +import com.monkeyk.sos.web.context.BeanProvider; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.util.Assert; + +/** + * 2018/10/14 + *

+ *

+ * Cache 操作相关 + * + * @author Shengzhao Li + * @since 1.0 + */ +public class SOSCacheUtils implements CacheConstants { + + + private SOSCacheUtils() { + } + + + /** + * 用户 Cache + * + * @return Cache instance + */ + public static Cache userCache() { + final CacheManager cacheManager = getCacheManager(); + return cacheManager.getCache(USER_CACHE); + } + + private static CacheManager getCacheManager() { + final CacheManager cacheManager = BeanProvider.getBean(CacheManager.class); + Assert.notNull(cacheManager, "cacheManager is null"); + return cacheManager; + } + + +} diff --git a/src/main/java/com/monkeyk/sos/service/business/CurrentUserJsonDtoLoader.java b/src/main/java/com/monkeyk/sos/service/business/CurrentUserJsonDtoLoader.java new file mode 100644 index 0000000..d7c6706 --- /dev/null +++ b/src/main/java/com/monkeyk/sos/service/business/CurrentUserJsonDtoLoader.java @@ -0,0 +1,40 @@ +package com.monkeyk.sos.service.business; + +import com.monkeyk.sos.domain.dto.UserJsonDto; +import com.monkeyk.sos.domain.shared.security.WdcyUserDetails; +import com.monkeyk.sos.domain.user.UserRepository; +import com.monkeyk.sos.web.context.BeanProvider; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.provider.OAuth2Authentication; + +/** + * 2018/10/14 + * + * @author Shengzhao Li + * @since 1.0 + */ +public class CurrentUserJsonDtoLoader { + + + private transient UserRepository userRepository = BeanProvider.getBean(UserRepository.class); + + public CurrentUserJsonDtoLoader() { + } + + public UserJsonDto load() { + + final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + final Object principal = authentication.getPrincipal(); + + if (authentication instanceof OAuth2Authentication && + (principal instanceof String || principal instanceof org.springframework.security.core.userdetails.User)) { + OauthUserJsonDtoLoader jsonDtoLoader = new OauthUserJsonDtoLoader((OAuth2Authentication) authentication); + return jsonDtoLoader.load(); + } else { + final WdcyUserDetails userDetails = (WdcyUserDetails) principal; + return new UserJsonDto(userRepository.findByGuid(userDetails.user().guid())); + } + } + +} diff --git a/src/main/java/com/monkeyk/sos/service/business/OauthUserJsonDtoLoader.java b/src/main/java/com/monkeyk/sos/service/business/OauthUserJsonDtoLoader.java new file mode 100644 index 0000000..8acf119 --- /dev/null +++ b/src/main/java/com/monkeyk/sos/service/business/OauthUserJsonDtoLoader.java @@ -0,0 +1,35 @@ +package com.monkeyk.sos.service.business; + +import com.monkeyk.sos.domain.dto.UserJsonDto; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.oauth2.provider.OAuth2Authentication; + +import java.util.Collection; + +/** + * 2018/10/14 + * + * @author Shengzhao Li + * @since 1.0 + */ +public class OauthUserJsonDtoLoader { + + private OAuth2Authentication oAuth2Authentication; + + public OauthUserJsonDtoLoader(OAuth2Authentication oAuth2Authentication) { + this.oAuth2Authentication = oAuth2Authentication; + } + + public UserJsonDto load() { + + UserJsonDto userJsonDto = new UserJsonDto(); + userJsonDto.setUsername(oAuth2Authentication.getName()); + + final Collection authorities = oAuth2Authentication.getAuthorities(); + for (GrantedAuthority authority : authorities) { + userJsonDto.getPrivileges().add(authority.getAuthority()); + } + + return userJsonDto; + } +} diff --git a/src/main/java/com/monkeyk/sos/service/business/UserFormSaver.java b/src/main/java/com/monkeyk/sos/service/business/UserFormSaver.java new file mode 100644 index 0000000..d185b02 --- /dev/null +++ b/src/main/java/com/monkeyk/sos/service/business/UserFormSaver.java @@ -0,0 +1,43 @@ +package com.monkeyk.sos.service.business; + +import com.monkeyk.sos.domain.dto.UserFormDto; +import com.monkeyk.sos.domain.user.User; +import com.monkeyk.sos.domain.user.UserRepository; +import com.monkeyk.sos.infrastructure.SOSCacheUtils; +import com.monkeyk.sos.web.WebUtils; +import com.monkeyk.sos.web.context.BeanProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 2018/10/14 + * + * @author Shengzhao Li + * @since 1.0 + */ +public class UserFormSaver { + + + private static final Logger LOG = LoggerFactory.getLogger(UserFormSaver.class); + + private transient UserRepository userRepository = BeanProvider.getBean(UserRepository.class); + + + private UserFormDto formDto; + + public UserFormSaver(UserFormDto formDto) { + this.formDto = formDto; + } + + public String save() { + + User user = formDto.newUser(); + userRepository.saveUser(user); + LOG.debug("{}|Save User: {}", WebUtils.getIp(), user); + + //Add to cache + SOSCacheUtils.userCache().put(user.username(), user); + + return user.guid(); + } +} diff --git a/src/main/java/com/monkeyk/sos/service/impl/UserServiceImpl.java b/src/main/java/com/monkeyk/sos/service/impl/UserServiceImpl.java index f7aabe6..78f0797 100644 --- a/src/main/java/com/monkeyk/sos/service/impl/UserServiceImpl.java +++ b/src/main/java/com/monkeyk/sos/service/impl/UserServiceImpl.java @@ -8,16 +8,13 @@ import com.monkeyk.sos.domain.shared.security.WdcyUserDetails; import com.monkeyk.sos.domain.user.User; import com.monkeyk.sos.domain.user.UserRepository; import com.monkeyk.sos.service.UserService; +import com.monkeyk.sos.service.business.CurrentUserJsonDtoLoader; +import com.monkeyk.sos.service.business.UserFormSaver; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.security.oauth2.provider.OAuth2Authentication; import org.springframework.stereotype.Service; -import java.util.Collection; import java.util.List; /** @@ -43,16 +40,8 @@ public class UserServiceImpl implements UserService { @Override public UserJsonDto loadCurrentUserJsonDto() { - final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - final Object principal = authentication.getPrincipal(); - - if (authentication instanceof OAuth2Authentication && - (principal instanceof String || principal instanceof org.springframework.security.core.userdetails.User)) { - return loadOauthUserJsonDto((OAuth2Authentication) authentication); - } else { - final WdcyUserDetails userDetails = (WdcyUserDetails) principal; - return new UserJsonDto(userRepository.findByGuid(userDetails.user().guid())); - } + CurrentUserJsonDtoLoader dtoLoader = new CurrentUserJsonDtoLoader(); + return dtoLoader.load(); } @Override @@ -70,21 +59,9 @@ public class UserServiceImpl implements UserService { @Override public String saveUser(UserFormDto formDto) { - User user = formDto.newUser(); - userRepository.saveUser(user); - return user.guid(); + UserFormSaver saver = new UserFormSaver(formDto); + return saver.save(); } - private UserJsonDto loadOauthUserJsonDto(OAuth2Authentication oAuth2Authentication) { - UserJsonDto userJsonDto = new UserJsonDto(); - userJsonDto.setUsername(oAuth2Authentication.getName()); - - final Collection authorities = oAuth2Authentication.getAuthorities(); - for (GrantedAuthority authority : authorities) { - userJsonDto.getPrivileges().add(authority.getAuthority()); - } - - return userJsonDto; - } } \ No newline at end of file diff --git a/src/main/java/com/monkeyk/sos/web/context/BeanProvider.java b/src/main/java/com/monkeyk/sos/web/context/BeanProvider.java new file mode 100644 index 0000000..ae3d845 --- /dev/null +++ b/src/main/java/com/monkeyk/sos/web/context/BeanProvider.java @@ -0,0 +1,39 @@ +package com.monkeyk.sos.web.context; + +import org.springframework.context.ApplicationContext; + +/** + * 2018/10/14 + *

+ * Spring bean容器, 启动时初始化 + * + * @author Shengzhao Li + * @see SOSContextLoaderListener + * @since 1.0 + */ +public abstract class BeanProvider { + + private static ApplicationContext springApplicationContext; + + + //private + private BeanProvider() { + } + + static void initialize(ApplicationContext applicationContext) { + BeanProvider.springApplicationContext = applicationContext; + } + + public static T getBean(Class clazz) { + return springApplicationContext == null ? null : springApplicationContext.getBean(clazz); + } + + @SuppressWarnings("unchecked") + public static T getBean(String beanId) { + if (springApplicationContext == null) { + return null; + } + return (T) springApplicationContext.getBean(beanId); + } + +} diff --git a/src/main/java/com/monkeyk/sos/web/context/SOSContextLoaderListener.java b/src/main/java/com/monkeyk/sos/web/context/SOSContextLoaderListener.java new file mode 100644 index 0000000..f612289 --- /dev/null +++ b/src/main/java/com/monkeyk/sos/web/context/SOSContextLoaderListener.java @@ -0,0 +1,28 @@ +package com.monkeyk.sos.web.context; + +import org.springframework.web.context.ContextLoaderListener; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +import javax.servlet.ServletContextEvent; + +/** + * 2018/10/14 + *

+ *

+ * 扩展 Spring Context, 方便获取 bean + * + * @author Shengzhao Li + * @since 1.0 + */ +public class SOSContextLoaderListener extends ContextLoaderListener { + + + @Override + public void contextInitialized(ServletContextEvent event) { + super.contextInitialized(event); + //ext + WebApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(event.getServletContext()); + BeanProvider.initialize(applicationContext); + } +} diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 220efb5..81351d7 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -132,11 +132,11 @@ - org.springframework.web.context.ContextLoaderListener + com.monkeyk.sos.web.context.SOSContextLoaderListener diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp index 41ba345..a2ddf86 100644 --- a/src/main/webapp/index.jsp +++ b/src/main/webapp/index.jsp @@ -5,6 +5,7 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" trimDirectiveWhitespaces="true" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> @@ -17,11 +18,20 @@ 1.0 -

- Login -  |  - Logout -

+ + Logged: +

+ Logout +

+
+ +

+ Login +  |  + Logout +

+
+
操作说明: