sa-token/sa-token-demo/sa-token-demo-sso-client/src/main/java/com/pj/sso/SsoClientController.java

58 lines
2.0 KiB
Java
Raw Normal View History

2021-06-24 18:00:54 +08:00
package com.pj.sso;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.sso.SaSsoUtil;
import cn.dev33.satoken.stp.StpUtil;
/**
* Sa-Token-SSO Client端 Controller
* @author kong
*/
@RestController
public class SsoClientController {
2021-06-26 23:30:29 +08:00
// SSO-Client端首页
@RequestMapping("/")
public String index() {
String str = "<h2>Sa-Token SSO-Client 应用端</h2>" +
"<p>当前会话是否登录:" + StpUtil.isLogin() + "</p>" +
"<p><a href=\"javascript:location.href='/ssoLogin?back=' + lencodeURIComponent(location.href);\">登录</a></p>";
return str;
}
// SSO-Client端登录地址
2021-06-24 18:00:54 +08:00
@RequestMapping("ssoLogin")
public Object login(String back, String ticket) {
2021-06-26 23:30:29 +08:00
// 如果当前Client端已经登录则无需访问SSO认证中心可以直接返回
2021-06-24 18:00:54 +08:00
if(StpUtil.isLogin()) {
return new ModelAndView("redirect:" + back);
}
/*
* 接下来两种情况
* ticket有值说明此请求从SSO认证中心重定向而来需要根据ticket进行登录
* ticket无值说明此请求是Client端访问需要重定向至SSO认证中心
*/
if(ticket != null) {
Object loginId = SaSsoUtil.getLoginId(ticket);
if(loginId != null ) {
// 如果ticket是有效的 (可以获取到值),需要就此登录 且清除此ticket
StpUtil.login(loginId);
SaSsoUtil.deleteTicket(ticket);
// 最后重定向回back地址
return new ModelAndView("redirect:" + back);
}
// 此处向客户端提示ticket无效即可不要重定向到SSO认证中心否则容易引起无限重定向
return "ticket无效: " + ticket;
}
// 重定向至 SSO-Server端 认证地址
String serverAuthUrl = SaSsoUtil.buildServerAuthUrl(SaHolder.getRequest().getUrl(), back);
return new ModelAndView("redirect:" + serverAuthUrl);
}
}