文章目录
-
- 权限系统是如何设计的?是如何工作的?
- rpc框架直接的认证鉴权是如何做的?
- 数据权限是如何划分的?
- 如果说自定义权限是如何实现的?
因为自己没有系统的搭建过权限框架,所以自己搭建一个,会附上源码的,有几个问题
我学习的视频是这个:【
[SpringSecurity框架教程-Spring Security+JWT实现项目级前端分离认证授权-挑战黑马&尚硅谷]
对应的源码分享:
git clone https://gitee.com/sunrui772995/SanGeng_Security_Project.git
权限系统是如何设计的?是如何工作的?
使用springSecurity进行权限认证的话,主要关注点就是用户权限,对于后端接口来说就是接口的权限设计,然后登陆者登录以后会查询当前用户的权限,是否包含此权限,没有的话就报错,有的话就执行。
@PreAuthorize("hasAnyAuthority('admin','test','system:dept:list')")
public String hello(){
return "hello";
}
上面这个示例 就表明了hello接口的权限是 admin,test,system:dept:list,用户有这三个权限的话就可以。
用户有哪些权限 ,基于RBAC模型, 我们需要有一个用户表,权限表,
role表,一个role对应多个权限,一个用户有多个role,这样就是用户和权限的关系对应起来了。 spring中接口进来以后会进入过滤器,会比较当前接口和自身的权限,就达成了权限的设计。可以结合代码自行分析。
public class MenuFilter implements FilterInvocationSecurityMetadataSource {
@Resource
private MenuMapper menuMapper;
/**
* 根据参数转化为 FilterInvocation 类型
* 获取当前请求的 requestUrl
* 根据 requestUrl 查询数据库 获取当前路经所需的权限列表
* 封装权限列表关键字段到 Collection
* 如果未获取到权限信息则默认为登录权限(不需要校验的/白名单路经)
*/
@Override
public Collection getAttributes(Object object) throws IllegalArgumentException {
HashSet set= new HashSet();
FilterInvocation filterInvocation = (FilterInvocation) object;
String requestUrl = filterInvocation.getRequestUrl();
System.out.println("=======================>>>请求路经:"+requestUrl);
//根据路经获取权限列表
List allPath = menuMapper.selectPermsByPath(requestUrl);
//封装权限列表
if (!CollectionUtils.isEmpty(allPath)){
allPath.forEach(path->{
set.add(new SecurityConfig(path));
});
}
//权限列表为空 未配置权限的都是白名单
if (ObjectUtils.isEmpty(set)){
return SecurityConfig.createList("ROLE_LOGIN");
}
//返回权限列表
return set;
}
上述代码就是用户访问接口,
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
@Autowired
private RedisCache redisCache;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//获取token
String token = request.getHeader("token");
if (!StringUtils.hasText(token)) {
//放行
filterChain.doFilter(request, response);
return;
}
//解析token
String userid;
try {
Claims claims = JwtUtil.parseJWT(to服务器托管网ken);
userid = claims.getSubject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("token非法");
}
//从redis中获取用户信息
String redisKey = "login:" + userid;
LoginUser loginUser = redisCache.getCacheObject(redisKey);
if(Objects.isNull(loginUser)){
throw new RuntimeException("用户未登录");
}
//存入SecurityContextHolder
//TODO 获取权限信息封装到Authentication中
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(loginUser,null,loginUser.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
//放行
filterChain.doFilter(request, response);
}
}
首先 用户登录需要携带token 这个token是可以向一个服务器获取的,就是加密的字符串,根据秘钥的不同进行加密,然后解析token,token中携带了自身的用户id,用户id存储在redis中,设置生效时间进行访问。
rpc框架直接的认证鉴权是如何做的?
数据权限是如何划分的?
数据权限有多套的方案,可以用mybatis-plus基于这个接口重新实现
如果说自定义权限是如何实现的?
public class SGExpressionRoot {
public boolean ha服务器托管网sAuthority(String authority){
//获取当前用户的权限
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
List permissions = loginUser.getPermissions();
//判断用户权限集合中是否存在authority
return permissions.contains(authority);
}
}
SpringSecurity实现原理是由一个一个的过滤器实现的
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: [AudioRecorder]iPhone苹果通话录音汉化破解版-使用巨魔安装-ios17绕道目前还不支持
首先你必须有巨魔才能使用!! 不会安装的,还没安装的移步这里,ios17 以上目前装不了,别看了:永久签名 | 网址分类目录 | 路灯iOS导航-苹果签名实用知识网址导航-各种iOS技巧-后厂村路灯 视频教程 【AudioRecorder】iPhone通话录音…