11.权限详解

1.加密方式:BCrypt

SysUserController.add

user.setPassword(BCrypt.hashpw(user.getPassword()));

BCrypt.hashpw

public static String hashpw(String password) {
        return hashpw(password, gensalt());//随机创建盐
    }

依然是加盐,不过和传统加盐区别有二:
每次的hash值都不一样
运算时间长
有文章指出bcrypt一个密码出来的时间比较长,需要0.3秒,而MD5只需要一微秒(百万分之一秒),一个40秒可以穷举得到明文的MD5,在bcrypt需要12年,时间成本太高。所以对于被保护者相对安全。况且登录事件不是频繁发生,每次使用系统只需一次登录即可,所以推荐使用BCrypt.

2.Sa-Token

参考目录

框架集成
基于 Sa-Token 最新版本:
根pom中
在这里插入图片描述

在这里插入图片描述

ruoyi-common-satoken的pom中
在这里插入图片描述

ruoyi-common-security的pom中
在这里插入图片描述

geteway中,注意由于gateway给予webflux所以引入的依赖和之前的不同:
[https://sa-token.dev33.cn/doc/index-backup.html#/micro/gateway-auth?id=%e5%be%ae%e6%9c%8d%e5%8a%a1-%e7%bd%91%e5%85%b3%e7%bb%9f%e4%b8%80%e9%89%b4%e6%9d%83]
在这里插入图片描述

由于原作者写的已经非常详细了,所以只做部分补充说明

登录认证流程

https://blog.csdn.net/Michelle_Zhong/article/details/122480703
补充:LoginUser.getLoginId返回的是拼合后的字符串,包含了id和用户类型(sys_user/app_user)
在监听器UserActionListener中通过判断不同登录设备类型用户,赋予对应的数据
在这里插入图片描述

补充:rouyi-common-satoken/SaPermissionImpl
配置用户的菜单权限列表与角色权限列表

package com.ruoyi.common.satoken.core.service;

import cn.dev33.satoken.stp.StpInterface;
import com.ruoyi.common.core.enums.UserType;
import com.ruoyi.common.satoken.utils.LoginHelper;
import com.ruoyi.system.api.model.LoginUser;

import java.util.ArrayList;
import java.util.List;

/**
* sa-token 权限管理实现类
*
* @author Lion Li
*/
public class SaPermissionImpl implements StpInterface {

    /**
* 获取菜单权限列表
*/
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        LoginUser loginUser = LoginHelper.getLoginUser();
        UserType userType = UserType.getUserType(loginUser.getUserType());
        if (userType == UserType.SYS_USER) {
            return new ArrayList<>(loginUser.getMenuPermission());
        } else if (userType == UserType.APP_USER) {
            // 其他端 自行根据业务编写
        }
        return new ArrayList<>();
    }

    /**
* 获取角色权限列表
*/
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        LoginUser loginUser = LoginHelper.getLoginUser();
        UserType userType = UserType.getUserType(loginUser.getUserType());
        if (userType == UserType.SYS_USER) {
            return new ArrayList<>(loginUser.getRolePermission());
        } else if (userType == UserType.APP_USER) {
            // 其他端 自行根据业务编写
        }
        return new ArrayList<>();
    }
}

通过注解校验用户权限

https://blog.csdn.net/Michelle_Zhong/article/details/122526722

Token 有效期及其续签

https://blog.csdn.net/Michelle_Zhong/article/details/126071871
在gateway中通过AuthFilter进行服务间鉴权
https://sa-token.dev33.cn/doc/index-backup.html#/micro/gateway-auth?id=%e5%be%ae%e6%9c%8d%e5%8a%a1-%e7%bd%91%e5%85%b3%e7%bb%9f%e4%b8%80%e9%89%b4%e6%9d%83
在这里插入图片描述

package com.ruoyi.gateway.filter;

import cn.dev33.satoken.reactor.filter.SaReactorFilter;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.ruoyi.common.core.constant.HttpStatus;
import com.ruoyi.gateway.config.properties.IgnoreWhiteProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * [Sa-Token 权限认证] 拦截器
 *
 * @author Lion Li
 */
@Configuration
public class AuthFilter {

    /**
     * 注册 Sa-Token 全局过滤器
     */
    @Bean
    public SaReactorFilter getSaReactorFilter(IgnoreWhiteProperties ignoreWhite) {
        return new SaReactorFilter()
            // 拦截地址
            .addInclude("/**")
            .addExclude("/favicon.ico", "/actuator/**")
            // 鉴权方法:每次访问进入
            .setAuth(obj -> {
                // 登录校验 -- 拦截所有路由
                SaRouter.match("/**")
                    .notMatch(ignoreWhite.getWhites())
                    .check(r -> {
                        // 检查是否登录 是否有token
                        StpUtil.checkLogin();

                        // 有效率影响 用于临时测试
                        // if (log.isDebugEnabled()) {
                        //     log.debug("剩余有效时间: {}", StpUtil.getTokenTimeout());
                        //     log.debug("临时有效时间: {}", StpUtil.getTokenActivityTimeout());
                        // }
                    });
            }).setError(e -> SaResult.error("认证失败,无法访问系统资源").setCode(HttpStatus.UNAUTHORIZED));
    }
}

其中的白名单配置:ignoreWhite.getWhites()

/**
 * 放行白名单配置
 *
 * @author ruoyi
 */
@Data
@NoArgsConstructor
@Configuration
@RefreshScope
@ConfigurationProperties(prefix = "security.ignore")
public class IgnoreWhiteProperties {
    /**
     * 放行白名单配置,网关不校验此处的白名单
     */
    private List<String> whites = new ArrayList<>();

}

其中的security.ignore
ruoyi-gateway.yml中
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AndroidManifest.xml 是 Android 应用程序的核心清单文件,它在应用程序打包和安装时自动包含在 APK 文件中。它包含了应用程序所有组件的描述信息,包括活动(Activity)、服务(Service)、广播接收器(BroadcastReceiver)和内容提供器(Content Provider)等。在 Android 应用程序运行时,系统会根据该文件中的信息来决定如何启动、暂停或停止应用程序中的各个组件。 下面是 AndroidManifest.xml 中常用的标签及其解释: 1. manifest 标签:表示整个清单文件。 2. uses-sdk 标签:指定应用程序所需的 Android SDK 版本。 3. application 标签:表示应用程序的主要配置信息,包括应用程序的名称、图标、主题、权限、进程等。 4. activity 标签:表示一个活动(Activity),即一个界面,用于与用户交互。其中包括活动的名称、标签、主题、启动模式、导航栏、窗口大小等信息。 5. service 标签:表示一个服务(Service),即在后台长期运行的组件,用于执行一些耗时任务。其中包括服务的名称、进程、权限等信息。 6. receiver 标签:表示一个广播接收器(BroadcastReceiver),用于接收系统或其他应用程序发送的广播消息。其中包括广播接收器的名称、权限、过滤器等信息。 7. provider 标签:表示一个内容提供器(Content Provider),用于为应用程序提供数据访问接口。其中包括内容提供器的名称、权限、URI 等信息。 8. uses-permission 标签:表示应用程序所需的权限,用于访问受保护的系统资源或执行某些敏感操作。 以上是常用的 AndroidManifest.xml 标签,每个标签都有其特定的属性和用法,需要根据实际情况进行配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值