AuthUtils.java 3.6 KB
Newer Older
zlt2000's avatar
zlt2000 已提交
1 2 3
package com.central.oauth2.common.util;

import com.central.common.constant.CommonConstant;
zlt2000's avatar
zlt2000 已提交
4
import com.central.common.model.SysUser;
zlt2000's avatar
zlt2000 已提交
5
import lombok.extern.slf4j.Slf4j;
zlt2000's avatar
zlt2000 已提交
6
import org.springframework.security.core.Authentication;
zlt2000's avatar
zlt2000 已提交
7 8 9 10 11
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
12
import java.nio.charset.StandardCharsets;
zlt2000's avatar
zlt2000 已提交
13 14 15 16 17 18 19 20 21 22 23
import java.util.Base64;
import java.util.Enumeration;

/**
 * 认证授权相关工具类
 *
 * @author zlt
 * @date 2018/5/13
 */
@Slf4j
public class AuthUtils {
24 25 26 27
    private AuthUtils() {
        throw new IllegalStateException("Utility class");
    }

zlt2000's avatar
zlt2000 已提交
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
    private static final String BASIC_ = "Basic ";

    /**
     * 获取requet(head/param)中的token
     * @param request
     * @return
     */
    public static String extractToken(HttpServletRequest request) {
        String token = extractHeaderToken(request);
        if (token == null) {
            token = request.getParameter(OAuth2AccessToken.ACCESS_TOKEN);
            if (token == null) {
                log.debug("Token not found in request parameters.  Not an OAuth2 request.");
            }
        }
        return token;
    }

    /**
     * 解析head中的token
     * @param request
     * @return
     */
    private static String extractHeaderToken(HttpServletRequest request) {
        Enumeration<String> headers = request.getHeaders(CommonConstant.TOKEN_HEADER);
        while (headers.hasMoreElements()) {
            String value = headers.nextElement();
zlt2000's avatar
zlt2000 已提交
55
            if ((value.startsWith(OAuth2AccessToken.BEARER_TYPE))) {
zlt2000's avatar
zlt2000 已提交
56 57 58 59 60 61 62 63 64 65 66 67 68 69
                String authHeaderValue = value.substring(OAuth2AccessToken.BEARER_TYPE.length()).trim();
                int commaIndex = authHeaderValue.indexOf(',');
                if (commaIndex > 0) {
                    authHeaderValue = authHeaderValue.substring(0, commaIndex);
                }
                return authHeaderValue;
            }
        }
        return null;
    }

    /**
     * *从header 请求中的clientId:clientSecret
     */
70
    public static String[] extractClient(HttpServletRequest request) {
zlt2000's avatar
zlt2000 已提交
71 72 73 74 75 76 77 78 79 80 81 82
        String header = request.getHeader("Authorization");
        if (header == null || !header.startsWith(BASIC_)) {
            throw new UnapprovedClientAuthenticationException("请求头中client信息为空");
        }
        return extractHeaderClient(header);
    }

    /**
     * 从header 请求中的clientId:clientSecret
     *
     * @param header header中的参数
     */
83 84
    public static String[] extractHeaderClient(String header) {
        byte[] base64Client = header.substring(BASIC_.length()).getBytes(StandardCharsets.UTF_8);
zlt2000's avatar
zlt2000 已提交
85
        byte[] decoded = Base64.getDecoder().decode(base64Client);
86
        String clientStr = new String(decoded, StandardCharsets.UTF_8);
zlt2000's avatar
zlt2000 已提交
87 88 89 90 91 92
        String[] clientArr = clientStr.split(":");
        if (clientArr.length != 2) {
            throw new RuntimeException("Invalid basic authentication token");
        }
        return clientArr;
    }
zlt2000's avatar
zlt2000 已提交
93 94 95 96 97 98 99 100 101 102 103 104 105 106

    /**
     * 获取登陆的用户名
     */
    public static String getUsername(Authentication authentication) {
        Object principal = authentication.getPrincipal();
        String username = null;
        if (principal instanceof SysUser) {
            username = ((SysUser) principal).getUsername();
        } else if (principal instanceof String) {
            username = (String) principal;
        }
        return username;
    }
zlt2000's avatar
zlt2000 已提交
107
}