mirror of
https://gitee.com/dromara/sa-token.git
synced 2025-10-21 02:57:23 +08:00
新增:权限认证文档新增[如何把权限精确搭到按钮级]示例说明
This commit is contained in:
@@ -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() {
|
||||
}
|
||||
|
||||
}
|
@@ -49,11 +49,6 @@
|
||||
可能是404了,SpringBoot环境下如果访问接口404后,会被重定向到`/error`,然后被再次拦截,如果是其它原因,欢迎加群反馈
|
||||
|
||||
|
||||
### 如何把权限精确搭到按钮级?
|
||||
在登录时,把当前用户拥有的权限码一次性返回给前端,让前端进行判断,<br>
|
||||
例如使用vue等框架可以这样写:`<button v-if="arr.indexOf('user:delete') > -1">删除按钮</button>` <br>
|
||||
其中`arr`是当前用户拥有的权限码数组,`user:delete`是显示按钮需要拥有的权限码,`删除按钮`是用户拥有权限码才可以看到的内容
|
||||
|
||||
|
||||
### 权限可以做成动态的吗?
|
||||
权限本来就是动态的,只有jwt那种模式才是非动态的
|
||||
|
@@ -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`是显示按钮需要拥有的权限码,`删除按钮`是用户拥有权限码才可以看到的内容
|
||||
|
||||
|
||||
注意:以上写法只为提供一个参考示例,不同框架有不同写法,开发者可根据项目技术栈灵活封装进行调用
|
||||
|
||||
### 前端有了鉴权后端还需要鉴权吗?
|
||||
**需要!前端的鉴权只是一个辅助功能,对于专业人员这些限制都是可以轻松绕过的,为保证服务器安全,无论前端是否进行了权限校验,后端接口都需要对会话请求再次进行权限校验!**
|
||||
|
@@ -66,6 +66,6 @@ StpUtil.getTokenValue();
|
||||
StpUtil.getTokenInfo();
|
||||
```
|
||||
|
||||
有关TokenInfo参数详解,请参考:[参考:TokenInfo参数详解](/fun/token-info)
|
||||
?> 有关TokenInfo参数详解,请参考:[参考:TokenInfo参数详解](/fun/token-info)
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user