From 24ac928fb90532522d1a05dc24fa4a9e678b3823 Mon Sep 17 00:00:00 2001 From: hanfeng Date: Wed, 21 Aug 2019 16:50:37 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E7=99=BB=E5=BD=95=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E5=9C=A8security=E4=B8=AD=E7=A1=AE=E5=AE=9A=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8admin=E5=92=8Capi=E4=B8=AD=E7=A1=AE=E5=AE=9A?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0,=E4=B8=8D=E5=9C=A8=E4=BD=BF=E7=94=A8url?= =?UTF-8?q?=E4=B8=AD=E7=9A=84grant=5Ftype=E6=9D=A5=E7=A1=AE=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdminAuthenticationProvider.java | 4 +- .../security}/AdminAuthenticationToken.java | 6 +-- .../AdminAuthenticationTokenParser.java | 21 +++++++++ .../MiniAppAuthenticationProvider.java | 4 +- .../security}/MiniAppAuthenticationToken.java | 3 +- .../MiniAppAuthenticationTokenParser.java | 21 +++++++++ .../security/config/WebSecurityConfig.java | 12 +++--- .../filter/LoginAuthenticationFilter.java | 43 +++++-------------- .../provider/AuthenticationTokenParser.java | 13 ++++++ 9 files changed, 79 insertions(+), 48 deletions(-) rename {yami-shop-security/src/main/java/com/yami/shop/security/provider => yami-shop-admin/src/main/java/com/yami/shop/admin/security}/AdminAuthenticationProvider.java (96%) rename {yami-shop-security/src/main/java/com/yami/shop/security/token => yami-shop-admin/src/main/java/com/yami/shop/admin/security}/AdminAuthenticationToken.java (85%) create mode 100644 yami-shop-admin/src/main/java/com/yami/shop/admin/security/AdminAuthenticationTokenParser.java rename {yami-shop-security/src/main/java/com/yami/shop/security/provider => yami-shop-api/src/main/java/com/yami/shop/api/security}/MiniAppAuthenticationProvider.java (96%) rename {yami-shop-security/src/main/java/com/yami/shop/security/token => yami-shop-api/src/main/java/com/yami/shop/api/security}/MiniAppAuthenticationToken.java (86%) create mode 100644 yami-shop-api/src/main/java/com/yami/shop/api/security/MiniAppAuthenticationTokenParser.java create mode 100644 yami-shop-security/src/main/java/com/yami/shop/security/provider/AuthenticationTokenParser.java diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/provider/AdminAuthenticationProvider.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/security/AdminAuthenticationProvider.java similarity index 96% rename from yami-shop-security/src/main/java/com/yami/shop/security/provider/AdminAuthenticationProvider.java rename to yami-shop-admin/src/main/java/com/yami/shop/admin/security/AdminAuthenticationProvider.java index a64d48a..8bb9cf0 100644 --- a/yami-shop-security/src/main/java/com/yami/shop/security/provider/AdminAuthenticationProvider.java +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/security/AdminAuthenticationProvider.java @@ -8,7 +8,7 @@ * 版权所有,侵权必究! */ -package com.yami.shop.security.provider; +package com.yami.shop.admin.security; import cn.hutool.core.util.StrUtil; @@ -19,8 +19,8 @@ import com.yami.shop.security.exception.BadCredentialsExceptionBase; import com.yami.shop.security.exception.ImageCodeNotMatchExceptionBase; import com.yami.shop.security.exception.UsernameNotFoundExceptionBase; import com.yami.shop.security.exception.BaseYamiAuth2Exception; +import com.yami.shop.security.provider.AbstractUserDetailsAuthenticationProvider; import com.yami.shop.security.service.YamiUserDetailsService; -import com.yami.shop.security.token.AdminAuthenticationToken; import lombok.AllArgsConstructor; import org.springframework.security.core.Authentication; import org.springframework.security.core.userdetails.UserDetails; diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/token/AdminAuthenticationToken.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/security/AdminAuthenticationToken.java similarity index 85% rename from yami-shop-security/src/main/java/com/yami/shop/security/token/AdminAuthenticationToken.java rename to yami-shop-admin/src/main/java/com/yami/shop/admin/security/AdminAuthenticationToken.java index 733ce82..53c3ac3 100644 --- a/yami-shop-security/src/main/java/com/yami/shop/security/token/AdminAuthenticationToken.java +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/security/AdminAuthenticationToken.java @@ -8,16 +8,14 @@ * 版权所有,侵权必究! */ -package com.yami.shop.security.token; +package com.yami.shop.admin.security; +import com.yami.shop.security.token.MyAuthenticationToken; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; -import java.util.Collection; - /** * 系统用户账号密码登陆 */ diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/security/AdminAuthenticationTokenParser.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/security/AdminAuthenticationTokenParser.java new file mode 100644 index 0000000..3a19163 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/security/AdminAuthenticationTokenParser.java @@ -0,0 +1,21 @@ +package com.yami.shop.admin.security; + +import com.yami.shop.common.util.Json; +import com.yami.shop.security.provider.AuthenticationTokenParser; +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.stereotype.Component; + +/** + * AdminAuthenticationTokenParser + * + * @author hanfeng + * @date 2019-08-21 + */ +@Component +public class AdminAuthenticationTokenParser implements AuthenticationTokenParser { + @Override + public AbstractAuthenticationToken parse(String authenticationTokenStr) { + AdminAuthenticationToken authRequest = Json.parseObject(authenticationTokenStr, AdminAuthenticationToken.class); + return authRequest; + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/provider/MiniAppAuthenticationProvider.java b/yami-shop-api/src/main/java/com/yami/shop/api/security/MiniAppAuthenticationProvider.java similarity index 96% rename from yami-shop-security/src/main/java/com/yami/shop/security/provider/MiniAppAuthenticationProvider.java rename to yami-shop-api/src/main/java/com/yami/shop/api/security/MiniAppAuthenticationProvider.java index b2757c5..3ab82a7 100644 --- a/yami-shop-security/src/main/java/com/yami/shop/security/provider/MiniAppAuthenticationProvider.java +++ b/yami-shop-api/src/main/java/com/yami/shop/api/security/MiniAppAuthenticationProvider.java @@ -8,7 +8,7 @@ * 版权所有,侵权必究! */ -package com.yami.shop.security.provider; +package com.yami.shop.api.security; import cn.binarywang.wx.miniapp.api.WxMaService; @@ -18,9 +18,9 @@ import com.yami.shop.security.enums.App; import com.yami.shop.security.exception.UsernameNotFoundExceptionBase; import com.yami.shop.security.exception.WxErrorExceptionBase; import com.yami.shop.security.model.AppConnect; +import com.yami.shop.security.provider.AbstractUserDetailsAuthenticationProvider; import com.yami.shop.security.service.YamiUser; import com.yami.shop.security.service.YamiUserDetailsService; -import com.yami.shop.security.token.MiniAppAuthenticationToken; import com.yami.shop.security.token.MyAuthenticationToken; import lombok.AllArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/token/MiniAppAuthenticationToken.java b/yami-shop-api/src/main/java/com/yami/shop/api/security/MiniAppAuthenticationToken.java similarity index 86% rename from yami-shop-security/src/main/java/com/yami/shop/security/token/MiniAppAuthenticationToken.java rename to yami-shop-api/src/main/java/com/yami/shop/api/security/MiniAppAuthenticationToken.java index 6493905..a1f192f 100644 --- a/yami-shop-security/src/main/java/com/yami/shop/security/token/MiniAppAuthenticationToken.java +++ b/yami-shop-api/src/main/java/com/yami/shop/api/security/MiniAppAuthenticationToken.java @@ -8,8 +8,9 @@ * 版权所有,侵权必究! */ -package com.yami.shop.security.token; +package com.yami.shop.api.security; +import com.yami.shop.security.token.MyAuthenticationToken; import lombok.NoArgsConstructor; import org.springframework.security.core.userdetails.UserDetails; diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/security/MiniAppAuthenticationTokenParser.java b/yami-shop-api/src/main/java/com/yami/shop/api/security/MiniAppAuthenticationTokenParser.java new file mode 100644 index 0000000..dd4e472 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/security/MiniAppAuthenticationTokenParser.java @@ -0,0 +1,21 @@ +package com.yami.shop.api.security; + +import com.yami.shop.common.util.Json; +import com.yami.shop.security.provider.AuthenticationTokenParser; +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.stereotype.Component; + +/** + * MiniAppAuthenticationTokenParser + * + * @author hanfeng + * @date 2019-08-21 + */ +@Component +public class MiniAppAuthenticationTokenParser implements AuthenticationTokenParser { + @Override + public AbstractAuthenticationToken parse(String authenticationTokenStr) { + MiniAppAuthenticationToken authRequest = Json.parseObject(authenticationTokenStr, MiniAppAuthenticationToken.class); + return authRequest; + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/config/WebSecurityConfig.java b/yami-shop-security/src/main/java/com/yami/shop/security/config/WebSecurityConfig.java index d66522d..323e96f 100644 --- a/yami-shop-security/src/main/java/com/yami/shop/security/config/WebSecurityConfig.java +++ b/yami-shop-security/src/main/java/com/yami/shop/security/config/WebSecurityConfig.java @@ -14,14 +14,14 @@ package com.yami.shop.security.config; import com.yami.shop.security.filter.LoginAuthenticationFilter; import com.yami.shop.security.handler.LoginAuthFailedHandler; import com.yami.shop.security.handler.LoginAuthSuccessHandler; -import com.yami.shop.security.provider.AdminAuthenticationProvider; -import com.yami.shop.security.provider.MiniAppAuthenticationProvider; +import com.yami.shop.security.provider.AuthenticationTokenParser; import lombok.SneakyThrows; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.factory.PasswordEncoderFactories; @@ -39,10 +39,10 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { private LoginAuthFailedHandler loginAuthFailedHandler; @Autowired - private AdminAuthenticationProvider adminAuthenticationProvider; + private AuthenticationProvider authenticationProvider; @Autowired - private MiniAppAuthenticationProvider miniAppAuthenticationProvider; + private AuthenticationTokenParser authenticationTokenParser; @Override @Bean @@ -57,8 +57,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { */ @Override public void configure(AuthenticationManagerBuilder auth) { - auth.authenticationProvider(adminAuthenticationProvider); - auth.authenticationProvider(miniAppAuthenticationProvider); + auth.authenticationProvider(authenticationProvider); } @Bean @@ -77,6 +76,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { } filter.setAuthenticationSuccessHandler(loginAuthSuccessHandler); filter.setAuthenticationFailureHandler(loginAuthFailedHandler); + filter.setAuthenticationTokenParser(authenticationTokenParser); return filter; } diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/filter/LoginAuthenticationFilter.java b/yami-shop-security/src/main/java/com/yami/shop/security/filter/LoginAuthenticationFilter.java index f86e50c..a506e45 100644 --- a/yami-shop-security/src/main/java/com/yami/shop/security/filter/LoginAuthenticationFilter.java +++ b/yami-shop-security/src/main/java/com/yami/shop/security/filter/LoginAuthenticationFilter.java @@ -12,16 +12,11 @@ package com.yami.shop.security.filter; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; -import com.yami.shop.common.util.Json; -import com.yami.shop.security.constants.SecurityConstants; -import com.yami.shop.security.exception.UnknownGrantTypeExceptionBase; -import com.yami.shop.security.token.AdminAuthenticationToken; -import com.yami.shop.security.token.MiniAppAuthenticationToken; +import com.yami.shop.security.provider.AuthenticationTokenParser; import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.authentication.AuthenticationServiceException; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; -import org.springframework.security.oauth2.common.util.OAuth2Utils; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import javax.servlet.ServletInputStream; @@ -32,44 +27,28 @@ import java.nio.charset.StandardCharsets; /** * 小程序登陆:此时principal为code - * post:http://127.0.0.1:8086/login?grant_type=mini_app + * post:http://127.0.0.1:8086/login * {principal:code} * 管理员登陆: - * post: http://127.0.0.1:8086/login?grant_type=admin + * post: http://127.0.0.1:8086/login * {principal:username,credentials:password} */ public class LoginAuthenticationFilter extends UsernamePasswordAuthenticationFilter { + private AuthenticationTokenParser authenticationTokenParser; + @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { if (!ServletUtil.METHOD_POST.equals(request.getMethod())) { throw new AuthenticationServiceException( "Authentication method not supported: " + request.getMethod()); } - String type = obtainParameter(request, OAuth2Utils.GRANT_TYPE); - - AbstractAuthenticationToken authRequest = null; - String requestBody = getStringFromStream(request); if (StrUtil.isBlank(requestBody)) { throw new AuthenticationServiceException("无法获取输入信息"); } - - // 小程序通过code登陆 - if(SecurityConstants.SPRING_SECURITY_RESTFUL_TYPE_MINI_APP.equals(type)){ - authRequest = Json.parseObject(requestBody, MiniAppAuthenticationToken.class); - } - - - // 账号密码登陆 - else if (SecurityConstants.SPRING_SECURITY_RESTFUL_TYPE_ADMIN.equals(type)) { - authRequest = Json.parseObject(requestBody, AdminAuthenticationToken.class); - } - - if (authRequest == null) { - throw new UnknownGrantTypeExceptionBase("未知的grant_type"); - } + AbstractAuthenticationToken authRequest = authenticationTokenParser.parse(requestBody); // Allow subclasses to set the "details" property setDetails(request, authRequest); @@ -81,12 +60,6 @@ public class LoginAuthenticationFilter extends UsernamePasswordAuthenticationFil authRequest.setDetails(authenticationDetailsSource.buildDetails(request)); } - private String obtainParameter(HttpServletRequest request, String parameter) { - String result = request.getParameter(parameter); - return result == null ? "" : result; - } - - private String getStringFromStream(HttpServletRequest req) { ServletInputStream is; try { @@ -106,4 +79,8 @@ public class LoginAuthenticationFilter extends UsernamePasswordAuthenticationFil return ""; } } + + public void setAuthenticationTokenParser(AuthenticationTokenParser authenticationTokenParser) { + this.authenticationTokenParser = authenticationTokenParser; + } } diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/provider/AuthenticationTokenParser.java b/yami-shop-security/src/main/java/com/yami/shop/security/provider/AuthenticationTokenParser.java new file mode 100644 index 0000000..94d6add --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/provider/AuthenticationTokenParser.java @@ -0,0 +1,13 @@ +package com.yami.shop.security.provider; + +import org.springframework.security.authentication.AbstractAuthenticationToken; + +/** + * AuthenticationTokenParser + * + * @author hanfeng + * @date 2019-08-21 + */ +public interface AuthenticationTokenParser { + AbstractAuthenticationToken parse(String authenticationTokenStr); +} From 41ff60bb15f17eab3762bfe25c3ea8e1f4ea1989 Mon Sep 17 00:00:00 2001 From: hanfeng Date: Wed, 21 Aug 2019 17:14:49 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=9A=82=E6=97=B6=E4=B8=8D=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E5=AF=B9=E8=B1=A1,=E4=BB=A5=E5=90=8E=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E5=88=B0=E5=85=AC=E4=BC=97=E5=8F=B7=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shop/security/provider/MpAuthenticationProvider.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/provider/MpAuthenticationProvider.java b/yami-shop-security/src/main/java/com/yami/shop/security/provider/MpAuthenticationProvider.java index ab8ec22..6babf40 100644 --- a/yami-shop-security/src/main/java/com/yami/shop/security/provider/MpAuthenticationProvider.java +++ b/yami-shop-security/src/main/java/com/yami/shop/security/provider/MpAuthenticationProvider.java @@ -12,9 +12,9 @@ package com.yami.shop.security.provider; +import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.emoji.EmojiUtil; -import cn.hutool.core.util.BooleanUtil; import com.yami.shop.security.enums.App; import com.yami.shop.security.exception.UsernameNotFoundExceptionBase; import com.yami.shop.security.exception.WxErrorExceptionBase; @@ -31,13 +31,12 @@ import me.chanjar.weixin.mp.bean.result.WxMpUser; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.stereotype.Component; /** * 微信公众号登陆 * @author LGH */ -@Component +//@Component @AllArgsConstructor public class MpAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider {