记 shiro实现免密登录 根据不同url跳转至不同登录页

本文介绍了如何使用Shiro实现微信端和其他第三方系统的免密登录功能。针对已绑定用户,通过将用户信息存入Shiro session来模拟登录。在遇到ServletContainerSessionManager管理session的问题后,转向使用Shiro的免密登录方式,通过继承UsernamePasswordToken并重写构造函数和密码匹配规则,实现了无需明文密码的登录过程。
摘要由CSDN通过智能技术生成

1.需求说明:

  本次对接微信端,也可以是第三方系统接入,除了我们本身的系统登录之外,需要对微信端连接进行登录。用户绑定微信id,未绑定的需要登录并绑定,绑定过的则直接登录。登录依托shiro管理。主要问题是绑定过的如何进项shiro登录,从数据库查询出的用户密码是加盐过的。

2.思路一:

    首先考虑到的是shiro登录成功后是如何记录用户已登录的,将查询的结果放到shiro的session中就能跳过登录环节了。通过翻看登录时的源码,发现 DelegatingSubject 类中实现login,继续看就会找到DefaultSecurityManager中的login()方法。

找到creatSubject()方法 。在内层中save中就能找到答案。

最终,在DefaultSubjectDAO中找到 saveToSession()中。可以看到 mergePrincipals()中有将我们的用户信息存入session并且key为 DefaultSubjectContext.PRINCIPALS_SESSION_KEY;mergeAuthenticationState(),可以看到 

session.setAttribute(DefaultSubjectContext.AUTHENTICATED_SESSION_KEY, Boolean.TRUE);

这里设置了该key返回true表示该用户对象是经过授权验证的。所以理论上只要我们也能在shiro封装的session里塞上这两个就能成功登录了。

 protected void mergePrincipals(Subject subject) {
        PrincipalCollection currentPrincipals = null;
        if (subject.isRunAs() && subject instanceof DelegatingSubject) {
            try {
                Field field = DelegatingSubject.class.getDeclaredField("principals");
                field.setAccessible(true);
                currentPrincipals = (PrincipalCollection)field.get(subject);
            } catch (Exception var5) {
                throw new IllegalStateException("Unable to access DelegatingSubject principals property.", var5);
            }
        }

        if (currentPrincipals == null || currentPrincipals.isEmpty(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值