package com.xjrsoft.module.system.controller; import cn.dev33.satoken.config.SaCookieConfig; import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.context.model.SaCookie; import cn.dev33.satoken.context.model.SaRequest; import cn.dev33.satoken.context.model.SaResponse; import cn.dev33.satoken.oauth2.config.SaOAuth2Config; import cn.dev33.satoken.oauth2.logic.SaOAuth2Handle; import cn.dev33.satoken.spring.SpringMVCUtil; import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.util.SaResult; import cn.hutool.core.util.IdUtil; import com.xjrsoft.common.annotation.XjrLog; import com.xjrsoft.common.constant.GlobalConstant; import com.xjrsoft.common.utils.RedisUtil; import com.xjrsoft.config.CommonPropertiesConfig; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.Map; /** * Oauth2 */ @Api(tags = "Oauth2") @RestController @AllArgsConstructor public class Oauth2Controller { @Autowired private CommonPropertiesConfig commonPropertiesConfig; private final RedisUtil redisUtil; // 处理所有OAuth相关请求 @RequestMapping("/oauth2/*") @ApiOperation(value = "oauth2", notes = "处理所有OAuth相关请求") @XjrLog(value = "处理所有OAuth相关请求") public Object request() { return SaOAuth2Handle.serverRequest(); } // Sa-OAuth2 定制化配置 @Autowired public void setSaOAuth2Config(SaOAuth2Config cfg) { // 配置:未登录时返回的View cfg.setNotLoginView(() -> { SaRequest req = SaHolder.getRequest(); Map paramMap = req.getParamMap(); StringBuilder param = new StringBuilder(); paramMap.forEach((k, v) -> { param.append("&").append(k).append("=").append(v); }); param.deleteCharAt(0); String callBackUrl = String.format("%s?%s", commonPropertiesConfig.getDomainApi(), param); String key = GlobalConstant.OAUTH2 + IdUtil.simpleUUID(); redisUtil.set(key, callBackUrl, 86400); SaResponse res = SaHolder.getResponse(); SaCookie cookie = new SaCookie() .setName("Oauth2Info") .setValue(key); res.addCookie(cookie); res.redirect(String.format("%s/#/login", commonPropertiesConfig.getDomainWeb())); return null; }). // 配置:登录处理函数 setDoLoginHandle((name, pwd) -> { if ("sa".equals(name) && "123456".equals(pwd)) { StpUtil.login(10001); return SaResult.ok(); } return SaResult.error("账号名或密码错误"); }). // 配置:确认授权时返回的View setConfirmView((clientId, scope) -> { Map map = new HashMap<>(); map.put("clientId", clientId); map.put("scope", scope); return new ModelAndView("confirm.html", map); }); } }