登录用户控制原创
金蝶云社区-开发者赋能部_吴富彪
开发者赋能部_吴富彪
5人赞赏了该文章 1,128次浏览 未经作者许可,禁止转载编辑于2022年04月01日 14:51:24

关键词:登录页配置、指定用户允许登录、单点登录


一、需求

    用户有自己的cas service系统,苍穹需要实现与cas service系统认证,可以通过SSO插件机智实现。这样客户有多套业务系统,只需通同一个登录页面(非苍穹登录页面)输入账号密码就可以登录所有系统。

    但是多套系统的原有登录页面还是存在的,用户也能通过原有页面登录指定系统。但是客户不想让普通用户通过系统原有页面登录,普通用户只能通过cas service认证中心统一的页面登录,特定的用户或管理员才可以(苍穹登录页面)登录。

    因为每套系统的管理员用户也有可能是不一样的,比如:苍穹的超级管理员是administrator,其他系统的是admin之类的


二、思路与方案

    通过服务端的控制:

    1、编写插件继承LoginAfterBase类的实现handling方法

    2、在插件中添加自己的业务逻辑判断,把不允许登录的用户抛出异常

    3、在MC配置参数login.after.handle.classes,值就是你的全限定类名

三、实现过程

   1、编写插件继承LoginAfterBase类的实现handling方法

public class LoginLimitTest extends LoginAfterBase {
	/**
	 * 完成登录后处理任务
	 * @param request
	 * @param sessionInfo 用户信息
	 */
    @Override
    public void handling(HttpServletRequest httpServletRequest, SessionInfo sessionInfo) {
        String userId = sessionInfo.getUserId();
        List<Long> userIds = new ArrayList<>(1);
        userIds.add(Long.valueOf(userId));
        List<Map<String, Object>> userInfoList = UserServiceHelper.get(userIds);
        if(userInfoList.size() > 0){
            Map<String, Object> usermap = userInfoList.get(0);
            //通过工号判断,只允许administrator用户登录;可自行通过其他条件判断
            String number = (String) usermap.get("number");
            if(!StringUtils.equals("administrator",number)){
                throw new KDException(BosErrorCode.requestContext, ResManager.loadKDString("业务人员不能从该页面登录!", null, "LoginLimitTest.java"));
            }
        }
    }
}

    2、在MC配置参数login.after.handle.classes,值就是你的全限定类名;保存并发布集群

    image.png

image.png

四、效果图


image.png

图2

 

五、开发环境版本

不限,本样例采用的轻量级环境,版本是: 苍穹版本号 COSMICV4.0.014.0  星瀚版本号 CONSTELLATIONV4.0.014.0

 

六、注意事项

    一开始的思路是通过前端js去控制:

image.png

后来发现前端控制需要编写很多判断,比如点击登录按钮或者通过回车键(enter)登录,都需要写相应的逻辑,而且前端是不可控的,有些人还是可以通过修改某些页面元素实现登录的。前端的一切操作都是不可靠的,可以被绕过的。

七、参考资料

开发平台

学习成长中心 


赞 5