新增:权限认证文档新增[如何把权限精确搭到按钮级]示例说明

This commit is contained in:
shengzhang
2021-02-28 02:05:48 +08:00
parent 7268279736
commit 4965149c23
4 changed files with 22 additions and 74 deletions

View File

@@ -1,67 +0,0 @@
package com.pj;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
/**
* 跨域过滤器
* @author kong
*/
@Component
public class CorsFilter implements Filter {
static final String OPTIONS = "OPTIONS";
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
// 获得客户端domain
String origin = request.getHeader("Origin");
if (origin == null) {
origin = request.getHeader("Referer");
}
// 允许指定域访问跨域资源
response.setHeader("Access-Control-Allow-Origin", origin);
// 允许客户端携带跨域cookie此时origin值不能为“*”,只能为指定单一域名
response.setHeader("Access-Control-Allow-Credentials", "true");
// 允许所有请求方式
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
// 有效时间
response.setHeader("Access-Control-Max-Age", "3600");
// 允许的header参数
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,satoken");
// 允许的header参数
// response.setHeader("Access-Control-Allow-Headers", "*");
// 如果是预检请求,直接返回
if (OPTIONS.equals(request.getMethod())) {
System.out.println("=======================浏览器发来了OPTIONS预检请求==========");
response.getWriter().print("");
return;
}
// System.out.println("*********************************过滤器被使用**************************2233");
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void destroy() {
}
}

View File

@@ -49,11 +49,6 @@
可能是404了SpringBoot环境下如果访问接口404后会被重定向到`/error`,然后被再次拦截,如果是其它原因,欢迎加群反馈
### 如何把权限精确搭到按钮级?
在登录时,把当前用户拥有的权限码一次性返回给前端,让前端进行判断,<br>
例如使用vue等框架可以这样写`<button v-if="arr.indexOf('user:delete') > -1">删除按钮</button>` <br>
其中`arr`是当前用户拥有的权限码数组,`user:delete`是显示按钮需要拥有的权限码,`删除按钮`是用户拥有权限码才可以看到的内容
### 权限可以做成动态的吗?
权限本来就是动态的只有jwt那种模式才是非动态的

View File

@@ -112,4 +112,24 @@ StpUtil.checkRoleOr("user:update", "user:delete");
### 拦截全局异常
有同学要问,鉴权失败,抛出异常,然后呢?要把异常显示给用户看吗?**当然不可以!** <br>
你可以创建一个全局异常拦截器,统一返回给前端的格式,参考:[码云GlobalException.java](https://gitee.com/sz6/sa-token/blob/master/sa-token-demo-springboot/src/main/java/com/pj/test/GlobalException.java)
你可以创建一个全局异常拦截器,统一返回给前端的格式,参考:[码云GlobalException.java](https://gitee.com/sz6/sa-token/blob/master/sa-token-demo-springboot/src/main/java/com/pj/test/GlobalException.java)
### 如何把权限精确搭到按钮级?
权限精确到按钮级的意思就是指:**权限范围可以控制到页面上的每一个按钮是否显示**
思路:如此精确的范围控制只依赖后端已经难以完成,此时需要前端进行一定的逻辑判断
1. 在登录时,把当前账号拥有的所有权限码一次性返回给前端
2. 前端将权限码集合保存在`localStorage`或其它全局状态管理对象中
3. 在需要权限控制的按钮上使用js进行逻辑判断例如在`vue`框架中我们可以使用如下写法:
``` js
<button v-if="arr.indexOf('user:delete') > -1">删除按钮</button>
```
其中:`arr`是当前用户拥有的权限码数组,`user:delete`是显示按钮需要拥有的权限码,`删除按钮`是用户拥有权限码才可以看到的内容
注意:以上写法只为提供一个参考示例,不同框架有不同写法,开发者可根据项目技术栈灵活封装进行调用
### 前端有了鉴权后端还需要鉴权吗?
**需要!前端的鉴权只是一个辅助功能,对于专业人员这些限制都是可以轻松绕过的,为保证服务器安全,无论前端是否进行了权限校验,后端接口都需要对会话请求再次进行权限校验!**

View File

@@ -66,6 +66,6 @@ StpUtil.getTokenValue();
StpUtil.getTokenInfo();
```
有关TokenInfo参数详解请参考[参考TokenInfo参数详解](/fun/token-info)
?> 有关TokenInfo参数详解请参考[参考TokenInfo参数详解](/fun/token-info)