优化 sso 章节文档

This commit is contained in:
click33 2024-05-01 11:33:17 +08:00
parent 818c1cb4eb
commit c52fd9c86f
6 changed files with 69 additions and 65 deletions

View File

@ -3,7 +3,7 @@
---
### 1、Ticket劫持攻击
在前面章节的 SSO-Server 示例中,配置项 `sa-token.sso.allow-url=*` 意为配置所有允许的Client端授权地址不在此配置项中的URL将无法单点登录成功
在前面章节的 SSO-Server 示例中,配置项 `sa-token.sso-server.allow-url=*` 意为配置所有允许的Client端授权地址不在此配置项中的URL将无法单点登录成功
为了方便测试,上述代码将其配置为`*`,但是,<font color="#FF0000" >在生产环境中,此配置项绝对不能配置为 * </font>,否则会有被 Ticket 劫持的风险
@ -26,7 +26,7 @@
<!------------- tab:yaml 风格 ------------->
``` yaml
sa-token:
sso:
sso-server:
# 配置允许单点登录的 url
allow-url: http://sa-sso-client1.com:9001/sso/login
```

View File

@ -15,7 +15,7 @@ public class SsoServerController {
// SSO-Server端处理所有SSO相关请求
@RequestMapping("/sso/*")
public Object ssoRequest() {
return SaSsoProcessor.instance.serverDister();
return SaSsoServerProcessor.instance.dister();
}
// ... 其它代码
@ -33,13 +33,13 @@ public class SsoServerController {
``` java
// 配置SSO相关参数
@Autowired
private void configSso(SaSsoConfig sso) {
private void configSso(SaSsoServerConfig ssoServer) {
// 自定义API地址
SaSsoUtil.ssoTemplate.apiName.ssoAuth = "/sso/auth2";
SaSsoServerProcessor.instance.ssoServerTemplate.apiName.ssoAuth = "/sso/auth2";
// ...
// SSO 相关配置
sso.setXxx ... ;
ssoServer.xxx ... ;
}
```
@ -61,25 +61,25 @@ public class SsoServerController {
// SSO-Server统一认证地址
@RequestMapping("/sso/auth")
public Object ssoAuth() {
return SaSsoProcessor.instance.ssoAuth();
return SaSsoServerProcessor.instance.ssoAuth();
}
// SSO-ServerRestAPI 登录接口
@RequestMapping("/sso/doLogin")
public Object ssoDoLogin() {
return SaSsoProcessor.instance.ssoDoLogin();
return SaSsoServerProcessor.instance.ssoDoLogin();
}
// SSO-Server校验ticket 获取账号id
@RequestMapping("/sso/checkTicket")
public Object ssoCheckTicket() {
return SaSsoProcessor.instance.ssoCheckTicket();
return SaSsoServerProcessor.instance.ssoCheckTicket();
}
// SSO-Server单点注销
@RequestMapping("/sso/signout")
public Object ssoSignout() {
return SaSsoProcessor.instance.ssoSignout();
return SaSsoServerProcessor.instance.ssoSignout();
}
// ... 其它方法

View File

@ -81,16 +81,16 @@ if(res.code == 401) {
``` java
// 配置未登录时返回的View
sso.setNotLoginView(() -> {
sso.notLoginView = () -> {
return new ModelAndView("xxx.html");
})
}
```
### 3、如何自定义登录API的接口地址
根据需求点选择解决方案:
#### 3.1、如果只是想在 setDoLoginHandle 函数里获取除 name、pwd 以外的参数?
#### 3.1、如果只是想在 doLoginHandle 函数里获取除 name、pwd 以外的参数?
``` java
// 在任意代码处获取前端提交的参数
String xxx = SaHolder.getRequest().getParam("xxx");

View File

@ -30,7 +30,7 @@ public class H5Controller {
// 根据ticket进行登录
@RequestMapping("/sso/doLoginByTicket")
public SaResult doLoginByTicket(String ticket) {
Object loginId = SaSsoProcessor.instance.checkTicket(ticket, "/sso/doLoginByTicket");
Object loginId = SaSsoClientProcessor.instance.checkTicketByMode2Or3(ticket, "/sso/doLoginByTicket");
if(loginId != null) {
StpUtil.login(loginId);
return SaResult.data(StpUtil.getTokenValue());
@ -122,14 +122,14 @@ public class H5Controller {
<!------------- tab:yaml 风格 ------------->
``` yaml
sa-token:
sso:
sso-client:
# SSO-Server端 统一认证地址
auth-url: http://127.0.0.1:8848/sa-token-demo-sso-server-h5/sso-auth.html
```
<!------------- tab:properties 风格 ------------->
``` properties
# SSO-Server端 统一认证地址
sa-token.sso.auth-url=http://127.0.0.1:8848/sa-token-demo-sso-server-h5/sso-auth.html
sa-token.sso-client.auth-url=http://127.0.0.1:8848/sa-token-demo-sso-server-h5/sso-auth.html
```
<!---------------------------- tabs:end ---------------------------->

View File

@ -75,7 +75,7 @@ public Object ssoRequest() {
if(req.isPath("/sso/auth") && req.hasParam("redirect") == false && StpUtil.isLogin()) {
return SaHolder.getResponse().redirect("/home");
}
return SaSsoProcessor.instance.serverDister();
return SaSsoServerProcessor.instance.serverDister();
}
```

View File

@ -212,19 +212,23 @@ public class SsoController {
// 处理 SSO-Server 端所有请求
@RequestMapping({"/sso/auth", "/sso/doLogin", "/sso/checkTicket", "/sso/signout"})
public Object ssoServerRequest() {
return SaSsoProcessor.instance.serverDister();
return SaSsoServerProcessor.instance.dister();
}
// 处理 SSO-Client 端所有请求
@RequestMapping({"/sso/login", "/sso/logout", "/sso/logoutCall"})
public Object ssoClientRequest() {
return SaSsoProcessor.instance.clientDister();
return SaSsoClientProcessor.instance.dister();
}
// 配置SSO相关参数
@Autowired
private void configSso(SaSsoConfig sso) {
// SSO配置代码参考文档前几章 ...
private void configSsoServer(SaSsoServerConfig ssoServer) {
// SSO Server 配置代码,参考文档前几章 ...
}
@Autowired
private void configSsoClient(SaSsoClientConfig ssoClient) {
// SSO Client 配置代码,参考文档前几章 ...
}
}
@ -248,58 +252,58 @@ public class SsoController {
@RestController
public class SsoUserServerController {
/**
* 新建一个 SaSsoProcessor 请求处理器
*/
public static SaSsoProcessor ssoUserProcessor = new SaSsoProcessor();
static {
// 自定义一个 SaSsoTemplate 对象
SaSsoTemplate ssoUserTemplate = new SaSsoTemplate() {
// 使用的会话对象 是自定义的 StpUserUtil
@Override
public StpLogic getStpLogic() {
return StpUserUtil.stpLogic;
}
/**
* 新建一个 SaSsoServerProcessor 请求处理器
*/
public static SaSsoServerProcessor ssoUserServerProcessor = new SaSsoServerProcessor();
static {
// 自定义一个 SaSsoTemplate 对象
SaSsoServerTemplate ssoUserTemplate = new SaSsoServerTemplate() {
// 使用的会话对象 是自定义的 StpUserUtil
@Override
public StpLogic getStpLogic() {
return StpUserUtil.stpLogic;
}
// 使用自定义的签名秘钥
SaSignConfig signConfig = new SaSignConfig().setSecretKey("xxxx-新的秘钥-xxxx");
SaSignTemplate userSignTemplate = new SaSignTemplate().setSignConfig(signConfig);
@Override
public SaSignTemplate getSignTemplate() {
public SaSignTemplate getSignTemplate(String client) {
return userSignTemplate;
}
};
// 让这个SSO请求处理器使用的路由前缀是 /sso-user而不是原先的 /sso
ssoUserTemplate.apiName.replacePrefix("/sso-user");
// 给这个 SSO 请求处理器使用自定义的 SaSsoTemplate 对象
ssoUserProcessor.ssoTemplate = ssoUserTemplate;
}
};
// 让这个SSO请求处理器使用的路由前缀是 /sso-user而不是原先的 /sso
ssoUserTemplate.apiName.replacePrefix("/sso-user");
/*
* 第二套 sso-server 服务处理所有SSO相关请求
* http://{host}:{port}/sso-user/auth -- 单点登录授权地址接受参数redirect=授权重定向地址
* http://{host}:{port}/sso-user/doLogin -- 账号密码登录接口接受参数name、pwd
* http://{host}:{port}/sso-user/checkTicket -- Ticket校验接口isHttp=true时打开接受参数ticket=ticket码、ssoLogoutCall=单点注销回调地址 [可选]
* http://{host}:{port}/sso-user/signout -- 单点注销地址isSlo=true时打开接受参数loginId=账号id、secretkey=接口调用秘钥
*/
@RequestMapping("/sso-user/*")
public Object ssoUserRequest() {
return ssoUserProcessor.serverDister();
}
// 给这个 SSO 请求处理器使用自定义的 SaSsoTemplate 对象
ssoUserServerProcessor.ssoServerTemplate = ssoUserTemplate;
}
/*
* 第二套 sso-server 服务处理所有SSO相关请求
* http://{host}:{port}/sso-user/auth -- 单点登录授权地址接受参数redirect=授权重定向地址
* http://{host}:{port}/sso-user/doLogin -- 账号密码登录接口接受参数name、pwd
* http://{host}:{port}/sso-user/checkTicket -- Ticket校验接口isHttp=true时打开接受参数ticket=ticket码、ssoLogoutCall=单点注销回调地址 [可选]
* http://{host}:{port}/sso-user/signout -- 单点注销地址isSlo=true时打开接受参数loginId=账号id、secretkey=接口调用秘钥
*/
@RequestMapping("/sso-user/*")
public Object ssoUserRequest() {
return ssoUserServerProcessor.dister();
}
// 自定义 doLogin 方法 */
// 注意点:
// 1、第2套 sso-server 对应的 RestApi 登录接口也应该更换为 /sso-user/doLogin而不是原先的 /sso/doLogin
// 2、在这里登录函数要使用自定义的 StpUserUtil.login(),而不是原先的 StpUtil.login()
@RequestMapping("/sso-user/doLogin")
public Object ssoUserRequest(String name, String pwd) {
if("sa".equals(name) && "123456".equals(pwd)) {
StpUserUtil.login(10001);
return SaResult.ok("登录成功!").setData(StpUserUtil.getTokenValue());
}
return SaResult.error("登录失败!");
}
// 自定义 doLogin 方法 */
// 注意点:
// 1、第2套 sso-server 对应的 RestApi 登录接口也应该更换为 /sso-user/doLogin而不是原先的 /sso/doLogin
// 2、在这里登录函数要使用自定义的 StpUserUtil.login(),而不是原先的 StpUtil.login()
@RequestMapping("/sso-user/doLogin")
public Object ssoUserRequest(String name, String pwd) {
if("sa".equals(name) && "123456".equals(pwd)) {
StpUserUtil.login(10001);
return SaResult.ok("登录成功!").setData(StpUserUtil.getTokenValue());
}
return SaResult.error("登录失败!");
}
}
```