!6 登录验证优化

Merge pull request !6 from TryAndTry/master
master
亚米科技 7 years ago committed by Gitee
commit 3c4e184acc

@ -8,7 +8,7 @@
* *
*/ */
package com.yami.shop.security.provider; package com.yami.shop.admin.security;
import cn.hutool.core.util.StrUtil; 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.ImageCodeNotMatchExceptionBase;
import com.yami.shop.security.exception.UsernameNotFoundExceptionBase; import com.yami.shop.security.exception.UsernameNotFoundExceptionBase;
import com.yami.shop.security.exception.BaseYamiAuth2Exception; 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.service.YamiUserDetailsService;
import com.yami.shop.security.token.AdminAuthenticationToken;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;

@ -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.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
/** /**
* *
*/ */

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

@ -8,7 +8,7 @@
* *
*/ */
package com.yami.shop.security.provider; package com.yami.shop.api.security;
import cn.binarywang.wx.miniapp.api.WxMaService; 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.UsernameNotFoundExceptionBase;
import com.yami.shop.security.exception.WxErrorExceptionBase; import com.yami.shop.security.exception.WxErrorExceptionBase;
import com.yami.shop.security.model.AppConnect; 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.YamiUser;
import com.yami.shop.security.service.YamiUserDetailsService; import com.yami.shop.security.service.YamiUserDetailsService;
import com.yami.shop.security.token.MiniAppAuthenticationToken;
import com.yami.shop.security.token.MyAuthenticationToken; import com.yami.shop.security.token.MyAuthenticationToken;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.error.WxErrorException;

@ -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 lombok.NoArgsConstructor;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;

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

@ -14,14 +14,14 @@ package com.yami.shop.security.config;
import com.yami.shop.security.filter.LoginAuthenticationFilter; import com.yami.shop.security.filter.LoginAuthenticationFilter;
import com.yami.shop.security.handler.LoginAuthFailedHandler; import com.yami.shop.security.handler.LoginAuthFailedHandler;
import com.yami.shop.security.handler.LoginAuthSuccessHandler; import com.yami.shop.security.handler.LoginAuthSuccessHandler;
import com.yami.shop.security.provider.AdminAuthenticationProvider; import com.yami.shop.security.provider.AuthenticationTokenParser;
import com.yami.shop.security.provider.MiniAppAuthenticationProvider;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.security.authentication.AuthenticationManager; 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.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.factory.PasswordEncoderFactories; import org.springframework.security.crypto.factory.PasswordEncoderFactories;
@ -39,10 +39,10 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private LoginAuthFailedHandler loginAuthFailedHandler; private LoginAuthFailedHandler loginAuthFailedHandler;
@Autowired @Autowired
private AdminAuthenticationProvider adminAuthenticationProvider; private AuthenticationProvider authenticationProvider;
@Autowired @Autowired
private MiniAppAuthenticationProvider miniAppAuthenticationProvider; private AuthenticationTokenParser authenticationTokenParser;
@Override @Override
@Bean @Bean
@ -57,8 +57,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
*/ */
@Override @Override
public void configure(AuthenticationManagerBuilder auth) { public void configure(AuthenticationManagerBuilder auth) {
auth.authenticationProvider(adminAuthenticationProvider); auth.authenticationProvider(authenticationProvider);
auth.authenticationProvider(miniAppAuthenticationProvider);
} }
@Bean @Bean
@ -77,6 +76,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
} }
filter.setAuthenticationSuccessHandler(loginAuthSuccessHandler); filter.setAuthenticationSuccessHandler(loginAuthSuccessHandler);
filter.setAuthenticationFailureHandler(loginAuthFailedHandler); filter.setAuthenticationFailureHandler(loginAuthFailedHandler);
filter.setAuthenticationTokenParser(authenticationTokenParser);
return filter; return filter;
} }

@ -12,16 +12,11 @@ package com.yami.shop.security.filter;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.extra.servlet.ServletUtil;
import com.yami.shop.common.util.Json; import com.yami.shop.security.provider.AuthenticationTokenParser;
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 org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.authentication.AuthenticationServiceException; import org.springframework.security.authentication.AuthenticationServiceException;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.AuthenticationException;
import org.springframework.security.oauth2.common.util.OAuth2Utils;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import javax.servlet.ServletInputStream; import javax.servlet.ServletInputStream;
@ -32,44 +27,28 @@ import java.nio.charset.StandardCharsets;
/** /**
* principalcode * principalcode
* post:http://127.0.0.1:8086/login?grant_type=mini_app * post:http://127.0.0.1:8086/login
* {principal:code} * {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} * {principal:username,credentials:password}
*/ */
public class LoginAuthenticationFilter extends UsernamePasswordAuthenticationFilter { public class LoginAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
private AuthenticationTokenParser authenticationTokenParser;
@Override @Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
if (!ServletUtil.METHOD_POST.equals(request.getMethod())) { if (!ServletUtil.METHOD_POST.equals(request.getMethod())) {
throw new AuthenticationServiceException( throw new AuthenticationServiceException(
"Authentication method not supported: " + request.getMethod()); "Authentication method not supported: " + request.getMethod());
} }
String type = obtainParameter(request, OAuth2Utils.GRANT_TYPE);
AbstractAuthenticationToken authRequest = null;
String requestBody = getStringFromStream(request); String requestBody = getStringFromStream(request);
if (StrUtil.isBlank(requestBody)) { if (StrUtil.isBlank(requestBody)) {
throw new AuthenticationServiceException("无法获取输入信息"); throw new AuthenticationServiceException("无法获取输入信息");
} }
AbstractAuthenticationToken authRequest = authenticationTokenParser.parse(requestBody);
// 小程序通过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");
}
// Allow subclasses to set the "details" property // Allow subclasses to set the "details" property
setDetails(request, authRequest); setDetails(request, authRequest);
@ -81,12 +60,6 @@ public class LoginAuthenticationFilter extends UsernamePasswordAuthenticationFil
authRequest.setDetails(authenticationDetailsSource.buildDetails(request)); 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) { private String getStringFromStream(HttpServletRequest req) {
ServletInputStream is; ServletInputStream is;
try { try {
@ -106,4 +79,8 @@ public class LoginAuthenticationFilter extends UsernamePasswordAuthenticationFil
return ""; return "";
} }
} }
public void setAuthenticationTokenParser(AuthenticationTokenParser authenticationTokenParser) {
this.authenticationTokenParser = authenticationTokenParser;
}
} }

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

@ -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.core.util.StrUtil;
import cn.hutool.extra.emoji.EmojiUtil; import cn.hutool.extra.emoji.EmojiUtil;
import cn.hutool.core.util.BooleanUtil;
import com.yami.shop.security.enums.App; import com.yami.shop.security.enums.App;
import com.yami.shop.security.exception.UsernameNotFoundExceptionBase; import com.yami.shop.security.exception.UsernameNotFoundExceptionBase;
import com.yami.shop.security.exception.WxErrorExceptionBase; 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.Authentication;
import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
/** /**
* *
* @author LGH * @author LGH
*/ */
@Component //@Component
@AllArgsConstructor @AllArgsConstructor
public class MpAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider { public class MpAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider {

Loading…
Cancel
Save