第一次使用sureness对其的分析以下执行逻辑

在这里插入图片描述

 SurenessSecurityManager securityManager = SurenessSecurityManager.getInstance();
 

SurenessSecurityManager中的静态常量每次创建是单例的

 private static final SurenessSecurityManager INSTANCE = new SurenessSecurityManager();

在这里插入图片描述

    @Override
    public List<Subject> createSubject(Object var1) {
        return subjectFactory.createSubjects(var1);
    }

SurenessSubjectFactory中的createSubjects(final Object request)

所有subjectCreate
在这里插入图片描述
在初始化的时候,在factory中将5个creator传入,也可以自定义creator
在这里插入图片描述

如果是jwt则会获取JwtSubjectServletCreator
在这里插入图片描述

CustomTokenSubjectCreator request应为{“Token” : “tokenValue”}的形式
(String token = account.getUsername() + “–” + System.currentTimeMillis()
+ “–” + refreshPeriodTime
+ “–”+ UUID.randomUUID().toString().replace("-", “”);)
在这里插入图片描述
经过filter得到所支持的creator
在这里插入图片描述
在这里插入图片描述

经过map得到subject,在经过filter过滤掉空的subject,剩下jwtsubject和nonesubject
在这里插入图片描述

在验证是否是过滤的路径,添加支持的角色,通过processmananger.process()按subject类型遍历合适的processor在认证和授权然后将subject包装成SubjectSum
在这里插入图片描述

JwtProcessor来验证jwtsubject
验证jwt重新build新的jwtsubject(没有jwt)
在这里插入图片描述
所有的processor(PasswordProcessor需要额外提供以个SurenessAccountProvider,通过appid查找相应的用户信息)
在这里插入图片描述
provider 获取数据源
所有的Provider
在这里插入图片描述
利用snakeyaml解析yml文件
在这里插入图片描述在这里插入图片描述
provider中loadaccount实现方法按照addid从配置文件中查找相应的信息
在这里插入图片描述
分析jwt认证
1.发送请求拦截器会进行判断由于是排除的url会直接访问,选择需要的provider,使用documentAccountprovider时,输入appid和password从yaml中查找account信息进行authentication,如果成功则返回jwt
2.当其他没有被排除的请求发送过来时,如果header有authentication的话找到相应的creator获得subject
在经过processor处理授权和认证(jwt解码认证和过期认证等等都在这里)把subject变成subjectsum
3.如果认证和授权成功则放行,访问相应的url,如果失败则会抛出异常,直到抛到intercptor中被捕捉,然后信息放到返回体中。

另外

// 认证鉴权成功则会返回带用户信息的subject 可以将subject信息绑定到当前线程上下文holder供后面使用
if (subject != null) {
    SurenessContextHolder.bindSubject(subject)
    log.debug("auth success!")
}
//使用 上下文获得当前登陆用户的信息(principa,roles,所请求的资源)
 val subject = SurenessContextHolder.getBindSubject()

在ktor中的使用

post("/api/v1/account/auth") {
        val receiveParameters = call.receive<Map<String, String>>()
        if (!receiveParameters.containsKey("appId") || !receiveParameters.containsKey("password")) {
            call.respond(HttpStatusCode.BadRequest)
            return@post finish()
        }
        val accountProvider = DocumentAccountProvider()
        val appId = receiveParameters["appId"]
        var password = receiveParameters["password"]
        val account = accountProvider.loadAccount(appId)
        if (account == null || account.isDisabledAccount || account.isExcessiveAttempts) {
            call.respond(HttpStatusCode.Forbidden)
            return@post finish()
        }
        if (account.password != null) {
            if (account.salt != null) {
                password = Md5Util.md5(password + account.salt)
            }
            if (account.password != password) {
                call.respond(HttpStatusCode.Forbidden)
                return@post finish()
            }
        }
        // Get the roles the user has - rbac
        val roles = account.ownRoles
        // issue jwt
        val jwt = JsonWebTokenUtil.issueJwt(
            randomUUID().toString(), appId,
            "token-server", 3600, roles
        )
        val body = Collections.singletonMap("token", jwt)
        call.respond(HttpStatusCode.OK,body)
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值