From 06f0cb55c5ac3e43e3a7a1934fc566c5c8adf400 Mon Sep 17 00:00:00 2001 From: xufenglei <xufenglei> Date: Thu, 04 Jan 2018 16:16:33 +0800 Subject: [PATCH] token 相关 --- src/main/java/com/moral/security/WebSecurityConfiguration.java | 3 src/main/java/com/moral/security/AuthorizationServerConfiguration.java | 9 ++ src/main/java/com/moral/security/ResourceServerConfiguration.java | 18 ++++ src/main/java/com/moral/service/impl/TokenServiceImpl.java | 110 +++++++++++++++++++++++++++ src/main/java/com/moral/service/TokenService.java | 11 ++ src/main/java/com/moral/controller/TokenControllers.java | 48 ++++++++++++ 6 files changed, 197 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/moral/controller/TokenControllers.java b/src/main/java/com/moral/controller/TokenControllers.java new file mode 100644 index 0000000..5376565 --- /dev/null +++ b/src/main/java/com/moral/controller/TokenControllers.java @@ -0,0 +1,48 @@ +package com.moral.controller; + +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.moral.service.TokenService; + +@RestController +public class TokenControllers { + + @Resource + private TokenService tokenService; + + @GetMapping("oauth/token/{type}/{username}/{password}") + public Map<String, Object> getAuthToken(@PathVariable("username") String username, + @PathVariable("password") String password, @PathVariable("type") String type, HttpServletRequest request) { + Map<String, Object> result = new HashMap<String, Object>(); + if (ObjectUtils.isEmpty(username) || ObjectUtils.isEmpty(password) || ObjectUtils.isEmpty(type)) { + result.put("msg", "���������������������"); + } else { + String url = request.getRequestURL().toString().replace(request.getRequestURI(), "") + request.getContextPath(); + String realPath = request.getServletContext().getRealPath("/"); + result = tokenService.getAuthToken(type, username, password, url); + } + return result; + } + + @PostMapping("oauth/token/{refresh_token}") + public Map<String, Object> getAuthToken(@PathVariable("refresh_token") String refresh_token,HttpServletRequest request) { + Map<String, Object> result = new HashMap<String, Object>(); + if (ObjectUtils.isEmpty(refresh_token)) { + result.put("msg", "���������������������"); + } else { + String url = request.getRequestURL().toString().replace(request.getRequestURI(), "") + request.getContextPath(); + result = tokenService.getAuthToken(refresh_token, url); + } + return result; + } +} diff --git a/src/main/java/com/moral/security/AuthorizationServerConfiguration.java b/src/main/java/com/moral/security/AuthorizationServerConfiguration.java index 17da5b1..c0b338f 100644 --- a/src/main/java/com/moral/security/AuthorizationServerConfiguration.java +++ b/src/main/java/com/moral/security/AuthorizationServerConfiguration.java @@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; @@ -17,6 +18,9 @@ public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter { private static String REALM = "MY_OAUTH_REALM"; + + @Autowired + private UserDetailsService userDetailsService; @Autowired private TokenStore tokenStore; @@ -43,7 +47,10 @@ @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { - endpoints.tokenStore(tokenStore).userApprovalHandler(userApprovalHandler).authenticationManager(authenticationManager); + endpoints.tokenStore(tokenStore) + .userApprovalHandler(userApprovalHandler) + .authenticationManager(authenticationManager) + .userDetailsService(userDetailsService); } @Override diff --git a/src/main/java/com/moral/security/ResourceServerConfiguration.java b/src/main/java/com/moral/security/ResourceServerConfiguration.java index a69f9b4..edde722 100644 --- a/src/main/java/com/moral/security/ResourceServerConfiguration.java +++ b/src/main/java/com/moral/security/ResourceServerConfiguration.java @@ -27,5 +27,23 @@ .authorizeRequests() .antMatchers("/test/**").permitAll() .and().exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler()); + + /*http.requestMatchers() + .antMatchers("/screen/**") + .and() + .authorizeRequests() + .antMatchers("/screen/**").permitAll() + .and() + .exceptionHandling() + .accessDeniedHandler(new OAuth2AccessDeniedHandler());*/ + + /*http.requestMatchers() + .antMatchers("/mobile/**") + .and() + .authorizeRequests() + .antMatchers("/mobile/**").permitAll() + .and() + .exceptionHandling() + .accessDeniedHandler(new OAuth2AccessDeniedHandler());*/ } } \ No newline at end of file diff --git a/src/main/java/com/moral/security/WebSecurityConfiguration.java b/src/main/java/com/moral/security/WebSecurityConfiguration.java index 98f1146..d54621f 100644 --- a/src/main/java/com/moral/security/WebSecurityConfiguration.java +++ b/src/main/java/com/moral/security/WebSecurityConfiguration.java @@ -14,6 +14,7 @@ import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.password.NoOpPasswordEncoder; import org.springframework.security.oauth2.provider.ClientDetailsService; import org.springframework.security.oauth2.provider.approval.ApprovalStore; import org.springframework.security.oauth2.provider.approval.TokenApprovalStore; @@ -44,7 +45,7 @@ .withUser("bill").password("abc123").roles("ADMIN").and() .withUser("bob").password("abc123").roles("USER"); -// auth.userDetailsService(userDetailsService).passwordEncoder(new Md5PasswordEncoder()); + auth.userDetailsService(userDetailsService).passwordEncoder(NoOpPasswordEncoder.getInstance()); } @Override diff --git a/src/main/java/com/moral/service/TokenService.java b/src/main/java/com/moral/service/TokenService.java new file mode 100644 index 0000000..2371f02 --- /dev/null +++ b/src/main/java/com/moral/service/TokenService.java @@ -0,0 +1,11 @@ +package com.moral.service; + +import java.util.Map; + +public interface TokenService { + + Map<String, Object> getAuthToken(String type, String username, String password, String url); + + Map<String, Object> getAuthToken(String token, String url); + +} diff --git a/src/main/java/com/moral/service/impl/TokenServiceImpl.java b/src/main/java/com/moral/service/impl/TokenServiceImpl.java new file mode 100644 index 0000000..221fdbe --- /dev/null +++ b/src/main/java/com/moral/service/impl/TokenServiceImpl.java @@ -0,0 +1,110 @@ +package com.moral.service.impl; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Resource; + +import org.apache.commons.codec.binary.Base64; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; +import org.springframework.web.client.RestTemplate; + +import com.moral.common.bean.Constants; +import com.moral.common.util.Crypto; +import com.moral.common.util.RedisUtil; +import com.moral.entity.Account; +import com.moral.entity.OperateUser; +import com.moral.service.AccountService; +import com.moral.service.OperateUserService; +import com.moral.service.TokenService; + +@Service +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class TokenServiceImpl implements TokenService { + + private static final String AUTH_SERVER_URI = "/oauth/token?grant_type=password&username={username}&password={password}"; + + private static final String REFRESH_SERVER_URI = "/oauth/token?grant_type=refresh_token&refresh_token={refresh_token}"; + + @Resource + private AccountService accountService; + + @Resource + private OperateUserService operateUserService; + + @Resource + private RedisTemplate<String, String> redisTemplate; + + @Override + public Map<String, Object> getAuthToken(String type, String username, String password, String url) { + Map<String, Object> result = new HashMap<String, Object>(); + password = Crypto.md5(password); + if ("screen".equals(type)) { + Account account = accountService.getAccountByAccountName(username); + if (ObjectUtils.isEmpty(account)) { + result.put("msg", "���������������������"); + return result; + } else { + if (!password.equals(account.getPassword())) { + result.put("msg", "������������������"); + return result; + } + if (Constants.IS_DELETE_TRUE.equals(account.getIsDelete())) { + result.put("msg", "���������������������������������������������"); + return result; + } + result.put("accountId", account.getId()); + } + } else if ("mobile".equals(type)) { + OperateUser operateUser = operateUserService.getOperateUserByMobile(username); + if (ObjectUtils.isEmpty(operateUser)) { + result.put("msg", "���������������������"); + return result; + } else { + if (!password.equals(operateUser.getPassword())) { + result.put("msg", "������������������"); + return result; + } + result.put("userId", operateUser.getId()); + } + } else { + result.put("msg", "������������������"); + return result; + } + RedisUtil.set(redisTemplate, "token_" + username, type); + RestTemplate restTemplate = new RestTemplate(); + HttpEntity<String> httpEntity = new HttpEntity<String>(getHeadersWithClientCredentials()); + Map map = restTemplate.postForObject(url + AUTH_SERVER_URI, httpEntity, Map.class, username, password); + result.putAll(map); + return result; + } + + @Override + public Map<String, Object> getAuthToken(String refresh_token, String url) { + HttpEntity<String> httpEntity = new HttpEntity<String>(getHeadersWithClientCredentials()); + RestTemplate restTemplate = new RestTemplate(); + Map map = restTemplate.postForObject(url + REFRESH_SERVER_URI, httpEntity, Map.class, refresh_token); + return map; + } + + private static HttpHeaders getHeaders() { + HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); + return headers; + } + + private static HttpHeaders getHeadersWithClientCredentials() { + String plainClientCredentials = "my-trusted-client:secret"; + String base64ClientCredentials = new String(Base64.encodeBase64(plainClientCredentials.getBytes())); + HttpHeaders headers = getHeaders(); + headers.add("Authorization", "Basic " + base64ClientCredentials); + return headers; + } + +} -- Gitblit v1.8.0