From af126b0c8df49c329dcf8816655fb3029fbbef8d Mon Sep 17 00:00:00 2001 From: Eric Zhao Date: Sat, 20 Apr 2019 22:05:44 +0800 Subject: [PATCH] dashboard: improve login page and update related document Signed-off-by: Eric Zhao --- sentinel-dashboard/README.md | 31 ++++++++++-------- .../Sentinel_Dashboard_Feature.md | 4 +-- .../dashboard/controller/AuthController.java | 12 +++---- .../src/main/resources/application.properties | 2 +- .../app/scripts/directives/header/header.html | 3 +- .../webapp/resources/app/views/login.html | 15 ++++++--- .../resources/assets/img/sentinel-logo.png | Bin 0 -> 28346 bytes 7 files changed, 38 insertions(+), 29 deletions(-) create mode 100644 sentinel-dashboard/src/main/webapp/resources/assets/img/sentinel-logo.png diff --git a/sentinel-dashboard/README.md b/sentinel-dashboard/README.md index 87ca5ab0..63de6672 100755 --- a/sentinel-dashboard/README.md +++ b/sentinel-dashboard/README.md @@ -20,29 +20,31 @@ mvn clean package ```bash java -Dserver.port=8080 \ --Dserver.servlet.session.timeout=7200 \ --Dauth.username=sentinel \ --Dauth.password=123456 \ -Dcsp.sentinel.dashboard.server=localhost:8080 \ -Dproject.name=sentinel-dashboard \ -jar target/sentinel-dashboard.jar ``` -上述命令中我们指定几个 JVM 参数,其中: -`-Dserver.port=8080` 用于指定 Spring Boot 启动端口为 `8080`; -`-Dserver.servlet.session.timeout=7200` 用于指定 Spring Boot 服务器端会话的过期时间,如不带后缀的7200表示7200秒,60m表示60分钟,默认为30分钟; -`-Dauth.username=sentinel`、 `-Dauth.password=123456` 用于指定控制台的登录用户和密码分别为sentinel和123456,如果省略这2个参数,默认用户和密码均为sentinel; -其余几个是 Sentinel 客户端的参数。 -为便于演示,我们对控制台本身加入了流量控制功能,具体做法是引入 `CommonFilter` 这个 Sentinel 拦截器。上述 JVM 参数的含义是: +上述命令中我们指定几个 JVM 参数,其中 `-Dserver.port=8080` 是 Spring Boot 的参数, +用于指定 Spring Boot 服务端启动端口为 `8080`。其余几个是 Sentinel 客户端的参数。 + +为便于演示,我们对控制台本身加入了流量控制功能,具体做法是引入 Sentinel 提供的 `CommonFilter` 这个 Servlet Filter。 +上述 JVM 参数的含义是: | 参数 | 作用 | |--------|--------| -|`Dcsp.sentinel.dashboard.server=localhost:8080`|向 Sentinel 客户端指定控制台的地址| -|`-Dproject.name=sentinel-dashboard`|向 Sentinel 指定本程序名称| +|`Dcsp.sentinel.dashboard.server=localhost:8080`|向 Sentinel 接入端指定控制台的地址| +|`-Dproject.name=sentinel-dashboard`|向 Sentinel 指定应用名称,比如上面对应的应用名称就为 `sentinel-dashboard`| + +全部的配置项可以参考 [启动配置项文档](https://github.com/alibaba/Sentinel/wiki/%E5%90%AF%E5%8A%A8%E9%85%8D%E7%BD%AE%E9%A1%B9)。 + +经过上述配置,控制台启动后会自动向自己发送心跳。程序启动后浏览器访问 `localhost:8080` 即可访问 Sentinel 控制台。 -全部配置项参考 [启动配置项](https://github.com/alibaba/Sentinel/wiki/%E5%90%AF%E5%8A%A8%E9%85%8D%E7%BD%AE%E9%A1%B9) +从 Sentinel 1.6.0 开始,Sentinel 控制台支持简单的**登录**功能,默认用户名和密码都是 `sentinel`。用户可以通过如下参数进行配置: -经过上述配置,控制台启动后会自动向自己发送心跳。程序启动后浏览器访问`localhost:8080`即可访问 Sentinel 控制台。 +- `-Dsentinel.dashboard.auth.username=sentinel` 用于指定控制台的登录用户名为 `sentinel`; +- `-Dsentinel.dashboard.auth.password=123456` 用于指定控制台的登录密码为 `123456`;如果省略这两个参数,默认用户和密码均为 `sentinel`; +- `-Dserver.servlet.session.timeout=7200` 用于指定 Spring Boot 服务端 session 的过期时间,如 `7200` 表示 7200 秒;`60m` 表示 60 分钟,默认为 30 分钟; ## 2. 客户端接入 @@ -53,6 +55,7 @@ java -Dserver.port=8080 \ ## 3. 验证是否接入成功 -客户端正确配置并启动后,会主动向控制台发送心跳包,汇报自己的存在;控制台收到客户端心跳包之后,会在左侧导航栏中显示该客户端信息。控制台能够看到客户端的机器信息,则表明客户端接入成功了。 +客户端正确配置并启动后,会**在初次调用后**主动向控制台发送心跳包,汇报自己的存在; +控制台收到客户端心跳包之后,会在左侧导航栏中显示该客户端信息。如果控制台能够看到客户端的机器信息,则表明客户端接入成功了。 更多:[控制台功能介绍](./Sentinel_Dashboard_Feature.md)。 \ No newline at end of file diff --git a/sentinel-dashboard/Sentinel_Dashboard_Feature.md b/sentinel-dashboard/Sentinel_Dashboard_Feature.md index c0edf3d4..fae1e9a3 100755 --- a/sentinel-dashboard/Sentinel_Dashboard_Feature.md +++ b/sentinel-dashboard/Sentinel_Dashboard_Feature.md @@ -55,8 +55,8 @@ Sentinel 提供了多种规则来保护系统的不同部分。流量控制规 项 | 类型 | 默认值 | 最小值 | 描述 --- | --- | --- | --- | --- -sentinel.dashboard.auth.username | String | sentinel | 无 | 登录控制台的用户,默认sentinel -sentinel.dashboard.auth.password | String | sentinel | 无 | 登录控制台的密码,默认sentinel +sentinel.dashboard.auth.username | String | sentinel | 无 | 登录控制台的用户名,默认为 `sentinel` +sentinel.dashboard.auth.password | String | sentinel | 无 | 登录控制台的密码,默认为 `sentinel` sentinel.dashboard.app.hideAppNoMachineMillis | Integer | 0 | 60000 | 是否隐藏无健康节点的应用,距离最近一次主机心跳时间的毫秒数,默认关闭 sentinel.dashboard.removeAppNoMachineMillis | Integer | 0 | 120000 | 是否自动删除无健康节点的应用,距离最近一次其下节点的心跳时间毫秒数,默认关闭 sentinel.dashboard.unhealthyMachineMillis | Integer | 60000 | 30000 | 主机失联判定,不可关闭 diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthController.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthController.java index 26f824be..58be6f65 100644 --- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthController.java +++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthController.java @@ -23,7 +23,7 @@ import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @@ -35,7 +35,7 @@ import javax.servlet.http.HttpServletRequest; * @since 1.6.0 */ @RestController -@RequestMapping(value = "/auth", produces = MediaType.APPLICATION_JSON_VALUE) +@RequestMapping("/auth") public class AuthController { private static Logger LOGGER = LoggerFactory.getLogger(AuthController.class); @@ -46,7 +46,7 @@ public class AuthController { @Value("${auth.password:sentinel}") private String authPassword; - @RequestMapping(value = "/login", method = RequestMethod.POST) + @PostMapping("/login") public Result login(HttpServletRequest request, String username, String password) { if (StringUtils.isNotBlank(DashboardConfig.getAuthUsername())) { authUsername = DashboardConfig.getAuthUsername(); @@ -56,13 +56,13 @@ public class AuthController { authPassword = DashboardConfig.getAuthPassword(); } - /** + /* * If auth.username or auth.password is blank(set in application.properties or VM arguments), * auth will pass, as the front side validate the input which can't be blank, * so user can input any username or password(both are not blank) to login in that case. */ - if ( StringUtils.isNotBlank(authUsername) && !authUsername.equals(username) - || StringUtils.isNotBlank(authPassword) && !authPassword.equals(password)) { + if (StringUtils.isNotBlank(authUsername) && !authUsername.equals(username) + || StringUtils.isNotBlank(authPassword) && !authPassword.equals(password)) { LOGGER.error("Login failed: Invalid username or password, username=" + username + ", password=" + password); return Result.ofFail(-1, "Invalid username or password"); } diff --git a/sentinel-dashboard/src/main/resources/application.properties b/sentinel-dashboard/src/main/resources/application.properties index 8b6852d3..609cd90e 100755 --- a/sentinel-dashboard/src/main/resources/application.properties +++ b/sentinel-dashboard/src/main/resources/application.properties @@ -11,6 +11,6 @@ logging.pattern.file= %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - % #auth settings auth.filter.exclude-urls=/,/auth/login,/auth/logout,/registry/machine -auth.filter.exclude-url-suffixes=htm,html,js,css,map,ico,ttf,woff +auth.filter.exclude-url-suffixes=htm,html,js,css,map,ico,ttf,woff,png auth.username=sentinel auth.password=sentinel \ No newline at end of file diff --git a/sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.html b/sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.html index d175f71d..744e7318 100755 --- a/sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.html +++ b/sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.html @@ -5,7 +5,8 @@ diff --git a/sentinel-dashboard/src/main/webapp/resources/app/views/login.html b/sentinel-dashboard/src/main/webapp/resources/app/views/login.html index 36d29c10..b5079789 100644 --- a/sentinel-dashboard/src/main/webapp/resources/app/views/login.html +++ b/sentinel-dashboard/src/main/webapp/resources/app/views/login.html @@ -1,6 +1,8 @@
-
-

Sentinel控制台

+
+ Sentinel Logo +
@@ -10,7 +12,7 @@
- +
@@ -20,8 +22,11 @@
-
- +
+ +
diff --git a/sentinel-dashboard/src/main/webapp/resources/assets/img/sentinel-logo.png b/sentinel-dashboard/src/main/webapp/resources/assets/img/sentinel-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..60e8826c1aa983cd835daa3b78bc8f5d0e097387 GIT binary patch literal 28346 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 TE1yp=Ob1brRh220G7b4Z*B#*5 literal 0 HcmV?d00001