All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.daijie.shiro.oauth2.RequestAuthenticationMatch Maven / Gradle / Ivy

The newest version!
package org.daijie.shiro.oauth2;

import javax.servlet.http.HttpServletRequest;

import org.daijie.core.result.ModelResult;
import org.daijie.core.util.http.CookieUtil;
import org.daijie.core.util.http.HttpConversationUtil;
import org.daijie.shiro.ShiroSecurity;
import org.daijie.shiro.oauth2.configure.ShiroOauth2Properties;
import org.daijie.shiro.oauth2.excption.ShiroOauth2MatchException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.client.RestTemplate;

import com.baomidou.kisso.security.token.SSOToken;

/**
 * 用户匹配器实现类
 * 通过请求其它shiro实现的登录服务
 * properties需要配置参数:
 * 		shiro.oauth2.loginUrl
 * 		shiro.oauth2.loginMethod
 * @author daijie_jay
 * @since 2017年12月27日
 */
public class RequestAuthenticationMatch implements AuthenticationMatch {
	
	private static final String HEADER_COOKIE_KEY = "Set-Cookie";
	
	@Autowired
	private ShiroOauth2Properties shiroOauth2Properties;
	
	@Autowired
	private ShiroSecurity shiroSecurity;
	
	@Autowired
	private RestTemplate restTemplate;

	@Override
	public Boolean match(String username, String password) {
		String url = shiroOauth2Properties.getLoginUrl();
		String method = shiroOauth2Properties.getLoginMethod();
		if(url.contains("{username}") || url.contains("{password}")){
			url.replaceAll("{username}", username);
			url.replaceAll("{password}", password);
		}else{
			if(url.contains("?")){
				url += "&";
			}else{
				url += "?";
			}
			url += "username=" + username + "&password=" + password;
		}
		@SuppressWarnings("rawtypes")
		ResponseEntity result = null;
		switch (RequestMethod.valueOf(method.toUpperCase())) {
		case GET:
			result = restTemplate.getForEntity(url, ModelResult.class);
			break;
		case POST:
			result = restTemplate.postForEntity(url, null, ModelResult.class);
			break;
		default:
			throw new ShiroOauth2MatchException("只能是GET或POST请求");
		}
		HttpServletRequest request = HttpConversationUtil.getRequest();
		for (String key : result.getHeaders().keySet()) {
			for(String value : result.getHeaders().get(key)){
				if(key.contains(HEADER_COOKIE_KEY) && value.contains(shiroSecurity.getCookieName())){
					String token = value.split(";")[0].split("=")[1];
					CookieUtil.set(shiroSecurity.getCookieName(), token, null);
					if(shiroSecurity.isKissoEnable()){
						request.setAttribute(shiroSecurity.getCookieName(), SSOToken.parser(token, false).getIssuer());
					}else{
						request.setAttribute(shiroSecurity.getCookieName(), token);
					}
				}
			}
		}
		return result.getBody().isSuccess();
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy