mirror of
https://gitee.com/dromara/sa-token.git
synced 2024-12-01 19:37:42 +08:00
优化 sso 章节文档
This commit is contained in:
parent
818c1cb4eb
commit
c52fd9c86f
@ -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
|
||||
```
|
||||
|
@ -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-Server:RestAPI 登录接口
|
||||
@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();
|
||||
}
|
||||
|
||||
// ... 其它方法
|
||||
|
@ -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");
|
||||
|
@ -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 ---------------------------->
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -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("登录失败!");
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user